`

java与模式 第四章 “开-闭”原则(OCP)

阅读更多

4.1 什么是开闭原则"开-闭"原则

    “开-闭”原则讲的是:一个软件系统应该对开展时开放的,对修改时关闭的。英文原话:

    (Software entity should be open for extension, but closed for modification)

    这个原则说的是,在设计一个模块的时候,应该可以使这个模块可以在不被修改的前提下被扩张。换言之,应该可以在不必修改源代码的情况下改变这个模块的行为。

   听上去很矛盾,但是通过一些使用一些设计模式就可以轻松的做到,如 适配器模式(adapter)等等。

   满足了OCP(Open-Closed Principle)原则可以给软件系统带来两个无法比拟的设计目标:

  1.扩展性。通过扩展已有的软件系统,可以提供新的行为,以满足对软件的新需求。

  2.稳定性。已有的软件模块,特别是最重要的抽象层模块不能被修改,这就是变化中的软件系统有一定的稳定性和可延续性。

 同时,又可以使系统的可维护性大大提高。

4.2怎么做到“开-闭”原则

   举个例子:

   中国有很多个省,在这里排除直辖市,每个省有管理很多城市。大概是这样的情况,中国管省,省管市。但是随着经济的发展,很多县城的经济发展很快,如苏州的的昆山,经济发展已经超越了很多城市,但是昆山市个县,昆山政府申请变为城市,但是国家又不想改变现有的城市编制和管理,于是县级市诞生了,昆山以县级市的身份展现在了全国人民心中。

 

    怎么才能实现“开-闭”原则

  抽象化是关键
  解决问题的关键在于抽象化。在像java这样的面向对象的语言中,可以给系统定义出一个一劳永逸,
不再更改的抽象设计,此设计允许有无穷无尽的实现,并且互不影响。在java语言中,给出一个抽象的类或者
接口,规定出具体方法必须提供的方法特征作为系统设计的抽象层。这个抽象层预见了所有的可能扩展,
因此,在任何扩展情况下都不会改变。这就使得系统的抽象层不需要修改,从而满足了“开-闭”原则的第二条
:对修改是关闭的。
  同时,由于从抽象层导出一个或多个新的具体类来实现抽象类或者接口就可以改变系统的行为,因此系统的设计对扩展时开放的,
这就满足了“开-闭”原则的第一条。
   对可变性的封装原则
    如何设计好抽象层的类或者接口,我们必须对系统的可变性进行封装。这就是所谓的”对可变性的封装原则
"(Principle of Encapsulation of Variation short for EVP)对可变性的封装原则 讲的是找到一个系统的可变因素,将其封装起来。


“对可变性的封装原则”意味着两点:
 1.一种可变性不应散落在很多角落,而应当被封装到一个对象里面。
 2.一种可变性不应当与另一种可变性混合在一起。

分享到:
评论

相关推荐

    Java与模式

    ### 第4章:“开-闭”原则(OCP) “开-闭”原则是软件设计的基石之一,主张软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。本章详细解释了如何遵循这一原则,并通过策略模式等示例展示了其在实际开发中...

    程序员考试刷题-java8-ocp-study-notes:跟踪OCPJava8书籍学习指南的存储库

    程序员考试刷题java8-ocp-study-notes 跟踪 OCP Java 8 书籍学习指南的存储库 我将在这里介绍的这本书是 Java 8 认证指南的第二部分。 第一个指南涵盖 OCA 考试(我已经通过了),本指南涵盖了 OCP 考试(1Z0-809 ...

    Java设计模式(第二版)中文版

    ### Java设计模式(第二版)中文版 #### 思维框架的培养;对新手与码农均适用 在软件开发领域,设计模式是一种被广泛采用的解决方案,它可以帮助开发者更好地组织代码、解决常见问题,并提高软件的整体质量和可维护...

    敏捷软件开发原则、模式与实践 C#版

    第一部分 敏捷开发 第1章 敏捷实践 第2章 极限编程概述 第3章 计划 第4章 测试 第5章 重构 第6章 一次编程实践 第二部分 敏捷设计 第7章 什么是敏捷设计 第8章 SRP:单一职责原则 第9章 OCP:开放-封闭原则 第10章 ...

    敏捷软件开发:原则、模式与实践

    第4章 测试 第5章 重构 第6章 一次编程实践 第二部分 敏捷设计 第7章 什么是敏捷设计 第8章 单一职责原则(SRP) 第9章 开放—封闭原则(OCP) 第10章 Liskov替换原则(LSP) 第11章 依赖倒置原则(DIP) 第12章 接口隔离...

    24种java设计模式介绍与6大设计原则

    #### 第4章 多例模式(Multiton Pattern) 多例模式类似于单例模式,但是允许多个实例存在,每个实例都有唯一的标识。 ##### 描述 多例模式允许根据不同的键值创建不同的实例,这在某些情况下比单例模式更灵活。 ...

    软件设计模式(java版)习题答案.pdf

    1. 开闭原则(OCP):它要求软件实体应当对扩展开放,对修改关闭。 2. 里氏替换原则(LSP):它要求继承必须确保超类所拥有的性质在子类中仍然成立。 3. 依赖倒置原则(DIP):它要求软件设计要面向接口编程,不要...

    敏捷软件开发:原则、模式与实践.pdf

    中文名: 敏捷软件开发:原则、模式与实践 原名: Agile Software Development:Principles,Patterns and Practices 别名: 软件工程实践丛书 作者: (美)Robert C.Martin译者: 邓辉 孟岩图书分类: 软件 资源格式: PDF ...

    Java设计模式课件.rar

    第四章“结构型模式”关注于如何组合类和对象以构建更复杂的结构。桥接模式、装饰器模式、外观模式、代理模式、组合模式、享元模式和适配器模式是这一章的重点。它们帮助我们在保持组件之间松耦合的同时,实现类与类...

    Java与模式(含示例代码)

    第4 章 “开-闭”原则(OCP).........45 4.1 什么是“开-闭”原则.................45 4.2 怎样做到“开-闭”原则.............45 4.3 与其他设计原则的关系...............47 4.4 策略模式对“开–闭”原则的支持 ...

    设计模式 刘伟 ppt

    第二章《面向对象设计原则》中,刘伟老师讲解了 SOLID 原则,包括单一职责原则(SRP)、开闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)以及依赖倒置原则(DIP)。这些原则指导我们如何编写易于扩展和...

    《JAVA设计模式》期末考试复习资料.docx

    10. **开闭原则(Open-Closed Principle, OCP)**:一个软件实体应该对扩展开放,对修改关闭,意味着应尽可能通过扩展已有代码来实现新功能,而不是修改已有的代码。 11. **建造者模式(Builder Pattern)**:建造...

    Java面向对象程序设计杨晓燕面向对象基本原则和模式.pptx

    面向对象程序设计是Java开发中的核心概念,它通过模拟现实世界中的对象来构建软件系统,使得代码更加清晰、可维护性更强。...因此,理解和应用面向对象的基本原则和模式是每个Java开发者必备的技能。

    【IT十八掌徐培成】Java基础第20天-03_消息重构——2.zip

    7. **面向对象设计原则**:在重构过程中,我们会应用到一些面向对象设计原则,如单一职责原则(SRP)、开闭原则(OCP)、里氏替换原则(LSP)、依赖倒置原则(DIP)和接口隔离原则(ISP)。这些原则指导我们如何更好...

    OOAD系列PPT

    第二章“设计原则”探讨了软件设计中的重要原则,如单一职责原则(SRP)、开闭原则(OCP)、里氏替换原则(LSP)、依赖倒置原则(DIP)、接口隔离原则(ISP)和迪米特法则(LoD)。这些原则是优秀设计的基础,能指导...

    ( 2 agile java.pdf

    - **面向对象设计原则**:介绍单责任原则(Single Responsibility Principle, SRP)、开闭原则(Open/Closed Principle, OCP)等设计原则。 - **异常处理**:学习如何捕获和处理程序运行时可能出现的异常情况,提高...

    java_chapter09.rar_Java培训教程

    如果第九章涉及高级主题,那么可能会讲解一些常见的设计模式,如工厂模式、单例模式、观察者模式等,以及如何在Java中实现它们。 7. **泛型**:Java的泛型允许在类型安全的情况下操作集合,避免了类型转换的麻烦。...

    OCPOCA认证考试指南全册:Oracle Database 11g(1Z0-051,1Z0-052,1Z0-053)--详细书签版(第2/2部分)

    第4章 配置Oracle网络环境 109 4.1 配置和管理Oracle网络 110 4.1.1 Oracle Net和客户端-服务器范例 110 4.1.2 Oracle Net与通信协议简介 111 4.1.3 建立会话 112 4.1.4 创建侦听器 114 4.1.5 数据库注册 116...

Global site tag (gtag.js) - Google Analytics