1 什么是开闭原则
开-闭原则(Open_Closed Principle):一个软件实体应当对扩展开放,对修改关闭。(SoftWare entities should be open for extension,but closed formodification)
也就是说设计一个模块的时候,应当使这个模块可以被不修改的前提下被扩展。
2 如何实现开闭原则(对扩展开放,对修改关闭)
实现开闭原则可以从抽象化和对可变性封装两个方面考虑。
一、一种可变性不应当散落在代码的很多角落里,而应当被封装在一个对象里面。对这众多的同一层次上的可变性进行抽象得到它们的抽象类,使这些同一层次上的可变性是 这个抽象类的具体子类。这个抽象类不可更改。
二、当系统需要增加一个可变性的时候,只需继承实现该抽象类即可达到这些不同可变性之间能够相互替换。
从以上两点我们可以看出第一点满足了开闭原则的对修改关闭,第二点满足了对扩展开放。
等看到设计模式中的策略模式时就刻意很容易理解,策略模式讲的就是有一组算法,将每一个算法封装起来,使得它们之间刻意相互替换,策略模式就是开闭原则的一个范例。
3 开闭原则与其他几大原则的关系
开闭原则是面向对象复用的基石,我们设计系统要达到到的目标就是对修改关闭对扩展开放。
里氏代换原则:里氏代换原则是对开闭原则的补充,开闭原则告诉我们任何基类出现的地方子类一定可以出现,开闭原则就是将关键步骤就是抽象化,在子类中实现扩展。
依赖倒转:讲的是要依赖于抽象而不要依赖于实现,它是实现开闭原则的手段,违反依赖倒转的原则就不可能达到开闭原则的要求
单一职责原则:类中的职责要单一,不能将不同的可变性封装在一个子类当中。
接口隔离原则:它讲的是应当为客户端提供尽可能小的单独接口,而不要提供打的接口,它使软件系统在功能扩展的过程中不会将修改的压力扩展到其他对象中。
迪米特法则:它将的是一个软件实体应当尽可能少的与其他实体发生作用。遵守迪米特法则会相对容易地做到对修改关闭。
合成/聚合复用原则:它讲的是优先使用组合而非继承。它是与里氏代换原则相辅相成的
4 开闭原则的优越性
一、提供扩展新的行为,满足对软件新的需求,使软件系统具有一定的适应性和灵活性。
二、对抽象层不能修改,保证了系统的稳定性和延续性。