“开-闭”原则

      经典力学的基石是牛顿三大定律。而面向对象的可复用设计(Object Oriented Design)的第一块基石,便是所谓“开闭原则”(Open-Closed Principlet,通常缩写成 ocp)。
开-闭原则:
       一个软件实体应当对扩展开放,对修改关闭。这个原则说的是在设计一个模块的时候,应当使这个模块可以再不被修改的前提下被扩展,换而言之,应该可以在不必修改源代码的情况下改变这个的模块的行为。
       所有的软件系统都有一个共同的性质,即对他们的需求都会随着时间的推移而发生变化。在软件系统面临新的需求时,系统的设计必须是稳定的。满足“开-闭”原则的设计可以给一个软件系统两个无可比拟的优越性:
      1.   通过扩展已有的软件系统,可以提供新的行为,以满足对软件的新需求,使变化中的软件系统有一定的适应性和灵活性。
      2.   已有的软件模块,特别是最重要的抽象层模块不能再修改,这就使变化中的软件系统有一定的稳定性和延续性。

    具有以上两个优点的软件系统是一个在高层次上实现了复用的系统,也是一个易于维护的系统。
如何实现开-闭原则: 
    咋看起来,不能修改而可以扩展似乎是互相矛盾的。怎么可以不修改而又可以扩展呢?
抽象化是关键
    解决问题的关键就在于抽象,在像java语言这样的面向对象的编程语言里面,可以给系统定义一个一劳永逸、不再更改的抽象设计,此设计允许有无穷无尽的行为在实现层被实现。在java语言里,可以给出一个或者多个抽象类或者接口,规定出所有的具体类必须提供的方法的特征(Signature)做为系统设计的抽象层。这个抽象层预见了所有可能的扩展,这就使得系统的抽象层不需修改,从而满足了“开-闭”原则的第二条:   对修改关闭
     同时由于从抽象层导出一个或多个新的具体类可以改变系统模块的行为,因而满足了“开-闭”原则的第一条:对扩展开放
对可变性的封装原则
      “开-闭”原则如果从另外一个角度来讲,就是所谓“对可变性封装原则”。即找到一个系统的可变因素,将之封装起来。它意味着两点:
      (1) 一种可变性不应当散落在代码的很多角落里,而应当被封装在一个类中。同一种可以变性的不同表象意味着同一个继承等级结构中的具体子类。
      (2) 一种可变性不应该与另一种可变性混合在一起。
     显然,“对可变性的封装原则”从工程的角度讲解了如何实现“开-闭”原则。
里氏代换原则
     里氏代换原则:任何基类可以出现的地方,子类一定可以出现。
      里氏代换原则是对“开-闭”原则的补充,实现“开-闭”原则的关键步骤就是抽象,而基类与子类的继承关系就是抽象的具体体现,所以里氏替换原则是对实现抽象的具体步骤的规范。
     一般而言,违反里氏代换原则的,也违反“开-闭”原则,反之不然。
依赖倒转原则
      依赖倒转原则:要依赖于抽象,不要依赖于实现。
      看上去依赖倒转原则与“开-闭”原则有很大的相似之处,实际上它们之间是目标与手段之间的关系。“开-闭”原则是目标,达到这一目标的手段是依赖倒转原则。
     换而言之,要想实现“开-闭”原则,就应当坚持依赖倒转原则。违反依赖倒转原则就不可能达到“开-闭”原则的要求。
合成/聚合复用原则
     合成/聚合复用原则:要尽量使用合成/聚合,而不是继承关系达到复用的目的。
     显然,合成/聚合复用原则是与里氏代换原则相辅相成的,两者又都是对实现“开-闭”原则的具体步骤的规范。前者要求设计师首先考虑合成/聚合关系,后者要求在使用继承关系时,必须确定这个关系符合一定的条件。
     遵守合成/聚合复用原则是实现“开-闭”原则的必要条件,违反这一条件,就无法是系统实现“开-闭”原则这一目标。
迪米特
     迪米特原则:一个软件实体应该尽可能少的与其他实体发生相互作用。
      当一个系统面临功能扩展的时候,其中会有一些模块,它们需要修改的压力比其他一些模块要大。可能这些模块需要或不需要修改,但无论哪种情况,如果这些模块是相对孤立的,那么它们就不会将修改的压力传递到其他模块。
     这就是说,一个遵守迪米特原则设计出来的系统在功能需要扩展时,会相对更容易做到对修改的关闭。
接口隔离原则
     接口隔离原则:应该为客户端提供尽可能小的、单独的接口,而不要提供大的总接口。
     显然,接口隔离原则与广义的迪米特原则都是对一个实体与其他实体的通信的限制。广义的迪米特原则要求尽可能限制通信的宽度和深度。接口隔离原则所限制的是通信的宽度,也就是说通信应该尽可能的窄。

    

转载于:https://my.oschina.net/gao0516/blog/110227

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值