开放-封锁原则

开放-封闭原则

开放-封闭原则:

    Open-Closed Principle,OCP,Software entities(classes,modules,functions etc) should open for extension ,but close for modification.

    OCP是所有面向对象原则的核心。软件设计本身所追求的目标就是封装变化、降低耦合,而开放封闭原则正是对这一目标的最直接体现。

核心的思想是:

    软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。

OCP主要体现在两个方面:

    对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
    对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。

   

    前几天开学术交流时,师哥师姐们说在做需求的时候顾客总是改变,而且也说不明白,老师回到,如果对方能把需求说明白,那他一定是一个高级软件设计师。是的,我们要接受这个事实,这才是我们的职责,否则要我们何用?

    无论是手机还是电脑,面对需求的变化,我们的软件也总是在不断的更新,每一次更新都是一次重构吗,当然不是,因为我们有OCP。邓小平提出的一国两制,就是一个OCP的例子,一个国家,两个制度,开放扩展,封闭修改。

    具体编程当中怎样实现OCP呢?核心思想就是对抽象编程,而不对具体编程,因为抽象相对稳定。让类依赖于固定的抽象,所以对修改就是封闭的;而通过面向对象的继承和对多态机制,可以实现对抽象体的继承,通过覆写其方法来改变固有行为,实现新的扩展方法,所以对于扩展就是开放的。这是实施开放封闭原则的基本思路,同时这种机制是建立在两个基本的设计原则的基础上,这就是里氏代换原则和合成/聚合复用原则。

 

里氏代换原则:

    Liskov Substitution Principle,LSP,What is wanted here is something like the following substitution property: If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T.
    什么意思呢,简单的点说就是子类替换掉父类时,软件单位的功能不受影响。

LSP与OCP的关系:

    LSP是对“开-闭”原则的补充。实现OCP原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以LSP是对实现抽象化的具体步骤的规范。

 

合成/聚合复用原则:

    Composite/Aggregate Reuse Principle,CARP,尽量使用合成/聚合,不要使用类继承。   

    合成:

    合成表示一种强的拥有关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样,打个比方:人有两个胳膊,胳膊和人就是部分和整体的关系,人去世了,那么胳膊也就没用了,也就是说胳膊和人的生命周期是相同的。

    聚合:

    聚合表示一种弱的拥有关系,体现的是A对象可以包含B对象,但是B对象并不是A对象的一部分,打个比方:人是群居动物,所以每个人属于一个人群,一个人群可以有多个人,所以人群和人是聚合的关系。

    为什么尽量使用CARP,不使用类继承:

    1.对象的继承关系在编译时就定义好了,所以无法在运行时改变从父类继承的子类的实现;2.子类的实现和它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化;3.当你复用子类的时候,如果继承下来的实现不适合解决新的问题,则父类必须重写或者被其它更适合的类所替换。这种依赖关系限制了灵活性,并最终限制了复用性。

 

参考资料:

http://baike.baidu.com/link?url=2sr_HaY8MYLJStPWWvPR674xxkvCLqZ4yJ4tpcUtNR_jitAR8-XDQ1dcK_rML7tKH-gc_d0ekbqCeZz42vJLlK

http://zhuyanfeng.com/archives/285

http://blog.chinaunix.net/uid-17102734-id-2830085.html

http://www.cnblogs.com/menglin2010/archive/2012/04/09/2435785.html