开放-封闭原则(The Open-Closeed Principle , 简称OCP),是说软件实体(类、模块、函数等等)应该可以扩展,但是不可修改。
*对于扩展是开放的(Open for extension),对于更改是封闭的( Closed for modification)。
*怎样的设计才能面对需求的改变却可以保持相对稳定,从而使得系统可以在第一个版本以后不断推出新的的版本呢?
*无论模块是多么的‘封闭’,都会存在一些无法对之封闭的变化。既然不可能完全封闭,设计人员必须对于他设计的模块应该对哪种变化封闭做出选择。他必须先猜测出最有可能发生的变化种类,然后构造抽象来隔离那些变化。
*在我们最初编写代码时,假设变化不会发生。当变化发生时,我们就创建抽象来隔离以后发生的
同类变化。
*面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。这就是‘开放-封闭原则’的精神所在。
*我们希望的是在开发工作展开不久就知道可能发生的变化。查明可能发生的变化所等待的时间越长,要创建正确的抽象就越困难。
*开放-封闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护、可扩展、可复用、灵活性好。开发人员仅对过程中呈现出频繁变化的那些部分作出抽象,然而,对于应用程序中的每个部分都刻意的进行抽象同样不是一个好主意,拒绝不成熟的抽象和抽象本身一样重要。
^实现开放封闭的核心思想就是对抽象编程,而不对具体编程,因为抽象相对稳定。让类依赖于固定的抽象,所以对修改就是封闭的;而通过面向对象的继承和对多态机制,可以实现对抽象体的继承,通过覆写其方法来改变固有行为,实现新的扩展方法,所以对于扩展就是开放的。这是实施开放封闭原则的基本思路,同时这种机制是建立在两个基本的设计原则的基础上,这就是Liskov替换原则和合成/聚合复用原则。
1、开放封闭原则,是最为重要的设计原则,Liskov替换原则和合成/聚合复用原则为开放封闭原则的实现提供保证。
2、可以通过Template Method模式和Strategy模式进行重构,实现对修改封闭、对扩展开放的设计思路。
3、封装变化,是实现开放封闭原则的重要手段,对于经常发生变化的状态一般将其封装为一个抽象,例如银行业务中的IBankProcess接口。
4、拒绝滥用抽象,只将经常变化的部分进行抽象,这种经验可以从设计模式的学习与应用中获得。
============================================
1.单一职责原则 Singlere Sponsibility Principle(SSP):描述的意思是每个类都只负责单一的功能,切不可太多,并且一个类应当尽量的把一个功能做到极致。
2.里氏替换原则 Liskov Substituition Principle(LSP):这个原则表达的意思是一个子类应该可以替换掉父类并且可以正常工作。
3. 接口隔离原则 Interface Segregation Principle(ISP):也称接口最小化原则,强调的是一个接口拥有的行为应该尽可能的小。
4. 依赖倒置原则 Dependence Inversion Principle(DIP):这个原则描述的是高层模块不该依赖于低层模块,二者都应该依赖于抽象,抽象不应该依赖于细节,细节应该依赖于抽象。
5.迪米特法则 Law of Demeter(LOD):也称最小知道原则,即一个类应该尽量不要知道其他类太多的东西,不要和陌生的类有太多接触。
6.开闭原则 Open-Close Principle(OCP):对修改关闭,对扩展开放