OCP原则(开闭则)

OCP原则-(Michale.Pan原创)

面向对象可利用设计(OOD)的第一块基石,就是"开-闭原则(Open-Closed principle,简称OCP,大家不要误认为是ORACLE的管理员证书,HAHA)。

    OCP原则认为:一个软件应该对扩展开放,对修改关闭。 这是由大师Bertrand Meyer提出,英文原文是:

    Software entities should be open for extension,but closed for modification.

    它认为,在设计模块时,软件应该使这个模块在不被修改的前提下被扩展,换句话,是不必修改源代码的情况改变模块的行为。我们大家经常用到的一些类库就是按照这样的原则进行设计的,如SUN的JDK开发包。遵守OCP原则的系统可以达到PNP的功能,即是可以插拨的。

    个人认为,在JAVA中,要达到OCP,关键是抽象化,可以定义一个或多个接口 或抽象类,规定所有具体类必须实现的方法作为抽象层,这个抽象预见了你的系统或模块将来的扩展,因此在任何扩展情况下都不会改变。这就使得系统的抽象层不需要修改,从而满足了OCP中对修改关闭的原则。但是由于有具体实现的类可以扩展来改变系统的行为,所以系统的设计是开放的,满足了OCP中扩展的要求。

    设计模式中有好多种模式都在不同程度上达到了"开-闭"原则的要求,举几个例子:

    1.简单工厂模式

    "开-闭"原则要求模块允许新产品加入系统中,无需对现有代码进行修改。在简单工厂中,对于产品的消费者是成立的,对于工厂是不成立的,每次增加一个新产品,都要修改工厂角色。但是产品的消费者可以避免修改。

    2.工厂方法模式

    工厂方法中,具体工厂类都有共同的接口,它们"生产"出很多的处于一个等级结构中的产品对象。使用这个设计的系统可以允许向系统加入新的产品类型,而不必修改已有的代码,只需要加入一个新的具体的工厂就OK了,所以对增加新的产品而言,完全支持"开-闭"原则。

    3.抽象工厂模式

    抽象工厂模式封装了产品对象的家族的可变性,从而可以使系统动态决定将那一个产品族的产品实例化,另一方面可以在新的产品对象引进到已有的系统中时不必修改,在产品对象家族变化时,可以维持系统的"开-闭"原则。

    4.BUILDER模式

    建造模式封装了建造一个有内部结构的产品对象的过程,因此这样的系统是向产品内部表象的改变开放的。

    5.桥梁模式

    桥梁模式是"对可变性的封装原则"很好的例子,在桥梁模式中,具体实现化类同的实现逻辑,但是所有的具体实现化类又有共同的接口。新的实现逻辑可以通过创建新的具体实现类加入到系统中。


你可能感兴趣的:(OCP原则(开闭则))