Chap4 “开—闭”原则(OCP)
4.1 What
一个软件实体应当对扩展开放,对修改关闭。(在设计一个模块的时候,应当使这个模块可以在不修改的前提下被扩展,即应当可以在不必修改源代码的情况下改变这个模块的行为。)
优越性:
(1)通过扩展已有的软件系统,可以提供新的行为。
(2)已有的软件模块,特别是最重要的抽象层模块不能再修改,是变化中的软件系统有一定的稳定性和延续性。
4.2 How
抽象化是关键
对可变性的封装原则(Principle of Encapsulation of Variation,常写作EVP)
即找到一个系统的可变因素,将之封装起来。
“对可变性的封装原则”意味着两点:
(1) 一种可变性不应当散落在代码的很多角落里,而应当被封装到一个对象中。同一种可变性的不同表象意味着同一个继承等级结构中的具体子类。
继承应当被看作是封装变化的方法,而不应当被认为是从一般的对象生成特殊的对象的方法
(2) 一种可变性不应当与另一种可变性混合在一起。(所有的类图的继承结构一般都不超过两层,不然就意味着将两种不同的可变性混合在了一起。)
4.3 与其他设计原则的关系
里氏代换原则(LSP):任何基类可以出现的地方,子类一定可以出现。
LSP是对OCP的补充。LSP是对实现抽象化的具体步骤的规范。
一般来说,违反LSP的,也违反OCP,反过来不一定成立。
倚赖倒转原则(DIP):要依赖于抽象,不要依赖于实现。
OCP是目标,而DIP是手段。
违反DIP,就不可能达到OCP的要求。
合成/聚合复用原则(ACRP):尽量使用合成/聚合,而不是继承关系达到复用的目的。
ACRP与LSP是相辅相成的,都是对实现OCP的具体步骤的规范,ACRP是实现OCP的必要条件。
迪米特法则(LoD):一个软件实体应当尽可能少的与其他实体发生相互作用。
一个遵守LoD设计出来的系统在功能需要扩展时,会相对更容易的做到对修改的关闭。LoD是一条通向OCP的道路。
接口隔离原则(ISP):应当为客户端提供尽可能小的单独的接口,而不要提供大的总接口。
ISP所限制的是通信的宽度,即通信要尽可能的窄。
遵循ISP和LoD,会使一个软件系统在功能扩展的过程当中,不会将修改的压力传递到其他的对象。
4.4 策略模式对OCP的支持
策略模式说的是:如果有一组算法,那么就将每一个算法封装起来,使他们可以互换。
4.5 在其他设计模式中的体现
所有的设计模式都是对不同的可变性的封装,从而使系统在不同的角度上达到OCP的要求。
简单工厂模式:
每次增加一个新的产品,都需要修改工厂角色,但产品的消费者可以避免进行修改。
工厂方法模式:
具体工厂类都有共同的接口,他们“生产”出很多的处于同一个等级结构中的产品对象。可以允许向系统加入新的产品类型,而不必修改已有代码。
抽象工厂模式:
封装了产品对象家族的可变化性,从而一方面可以使系统动态的决定将哪一个产品族的产品实例化,另一方面可以在新的产品对象引进到已有的系统中时不必修改已有的系统。即:在产品对象家族发生变化时,这一设计可以维持系统的OCP特性。
建造模式:
封装了一个有内部结构的产品对象的过程,因此,这样的系统是向产品内部表象的改变开放的。
桥梁模式:
是“对可变性的封装原则”的极好例子。在这种模式中,具体实现化类代表不同的实现逻辑,但是所有的具体实现化类又有共同的接口。新的实现逻辑可以通过创建新的具体实现化类加入到系统里面。
门面模式:
调停者模式:
访问者模式:
迭代子模式:
4.6 一个重构做法的讨论
例子:将条件转移语句改写成为多态性。
寻找可变性的线索
何时使用这种重构做法
如果一个条件转移语句确实封装了某种业务逻辑的可变性,那么将此种可变性封装袭来就符合OCP设计思想了。
但是,如果一个条件转移语句没有设计重要的业务逻辑,或者不会随着时间的变化而变化,也不意味着任何的可扩展性,那么他就没有涉及热河有意义的可变性。如果将之改写为多态性就是“多态性污染”
分享到:
相关推荐
Java模式是面向对象设计中的一种最佳实践集合,它通过总结并提炼出在软件设计中反复出现的问题和解决方案,为开发者提供了可复用的设计方案。在Java编程中,遵循这些模式可以提高代码的可读性、可维护性和可扩展性。...
在《JAVA与模式读书笔记》中,我们探讨的是Java编程语言与设计模式的结合应用,这对于深入理解面向对象编程和提升软件开发能力至关重要。设计模式是软件工程中的最佳实践,它们是解决常见问题的模板,可以提高代码的...
通过阅读《Java游戏编程读书笔记》这本书,你可以深入了解这些概念并学习如何将它们应用到实际项目中。文档中的内容可能涵盖了Java游戏开发的基本原理、代码示例、最佳实践以及常见问题的解决方案。通过深入学习和...
"Effective Java读书笔记" Effective Java是一本关于Java编程语言的经典...Effective Java读书笔记总结了Java语言的发展历程、静态工厂方法的应用、构造器模式的使用等重要知识点,为Java开发者提供了有价值的参考。
读书笔记:尚硅谷Java设计模式图解+框架源码剖析学习笔记
IO系统解构有装饰者设计模式息息相关,所以先从分析它们的关系:
从《Java 2 核心技术 卷 1:基础知识》的读书笔记中,我们可以提取出以下几个关键知识点: 1. **强类型语言**:Java要求所有变量在使用前必须声明其类型,这确保了程序的稳定性和类型安全。每个程序都必须包含至少...
学生读书笔记共享系统代码 java学生读书笔记共享系统代码 基于springboot的学生读书笔记共享系统代码 1、学生读书笔记共享系统的技术栈、环境、工具、软件: 1、技术栈:java,springboot,vue,ajax,maven,mysql,...
以上知识点只是《Java完美经典》读书笔记中的一部分,完整的笔记还包括对这些概念的深入探讨,例如设计模式、并发编程、数据库操作、XML处理等。通过阅读并实践这些笔记,Java开发者能够不断巩固和提高自己的编程...
这份读书笔记记录了读者在研读此书过程中的理解和体会,涵盖了从基础语法到高级特性的全面解析。以下是笔记中可能涉及的一些关键知识点: 1. **Java语言简介**:Java是一种跨平台的、面向对象的编程语言,由Sun ...
在本篇【JAVA面向对象编程(孙卫琴)读书笔记(三)】中,我们将深入探讨Java编程语言的核心概念——面向对象编程。这篇读书笔记基于孙卫琴老师的著作,旨在帮助开发者更好地理解和应用面向对象的设计原则和技巧。下面...
读书笔记:图解Java设计模式
《Effective Java》是Java开发领域的经典著作,作者Joshua Bloch深入浅出地阐述了编写高效、健壮的Java代码的技巧和最佳实践。以下是对该书部分内容的详细解释: 1. **产生和销毁对象** - Item1:静态工厂方法相比...
读书笔记:《图解 Java 多线程设计模式》 笔记
读书笔记:Java实现的《大话设计模式》笔记
读书笔记:Java多线程编程实战指南设计模式篇 之读书笔记
Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems...通过阅读《Java学习笔记(必看经典)》和《Java与模式》,初学者或有经验的开发者都能深入理解Java编程,并掌握设计和实现高效、可维护的Java应用的方法。
读书笔记:图解设计模式Java
读书笔记:图解设计模式 Java