java与模式笔记(3.1)——原则篇之根本原则:开-闭原则

来源:互联网 发布:如何优化发展环境 编辑:程序博客网 时间:2024/05/15 05:30

原始描述是:一个软件实体应该对拓展开放,对修改关闭。换句话说就是在设计一个程序模块的时候,应当可以做到在不改变程序代码的情况下改变程序的功能(拓展)。

开闭原则是各个原则的根本原则,他实现了程序设计的三大目标拓展性,灵活性,插入性。

书中举例了一个玉帝诏安孙悟空的例子。孙悟空要当皇帝(实现新的功能,通过继承关系使得玉帝和文武群仙添加接口,成为他们的父类或者父类的父类),然而玉帝不肯(变动不能影响现有的程序代码),于是把孙悟空诏安了(让孙悟空成为玉帝的一个聚合类“文武群仙”的子类)。

这就揭示出了开闭原则的关键——抽象化

抽象化提供一个不再更改的抽象设计,它能够应付任何拓展,从而形成了一个不变的抽象层,然而这个抽象层部允许任何的修改,于是就实现了开闭原则的“闭”。由于抽象类允许生成一个或者多个新的实现层的子类在不改变原程序的情况下来改变现有的功能,于是就实现了开闭原则的“开”。

这就引导出了一个原则:对可变性的封装原则——考虑你系统中的一个可变因素,并将其封装到一个对象中。对可变性的封装原则意味着两点:(1)一个具有可变性的功能不应该散落在程序代码的各个角落,应该被封装到一个具体的对象中。(2)一种可变性不应该跟另外一种可变性混合在一起。也就是说继承一般不会超过两层,否则就是把2种可变性混合在了一起。这里的可变性是指商务逻辑的可变性,并不是普通的条件转移语句。而把条件转移语句转化为多态是我们常用的对代码重构的做法,要注意判断清楚。

开闭原则的实现是个非常困难的事情,为了实现开闭原则,我们研究了一些它所具有的规律,这些规律也是我们要遵守的原则。

l         里氏代换原则——任何基类可以出现的地方子类一定可以出现。是开闭原则的补充,是对抽象化的实现的规范。

l         合成/聚合复用原则——应当尽量使用合成和聚合来实现复用而不是继承。同里氏代换原则一样是抽象化的实现的规范,是实现开闭原则的必要条件,违反这个原则,就无法实现开闭原则。

l         依赖倒转原则——程序设计要针对抽象而不是针对实现。如果说开闭原则是目标,那么依赖倒转原则就是手段。

l         迪米特法则——一个软简单体应该尽可能少的与另外的软件单体相互作用。这个法则使得通往开闭原则的道路更加平坦。是开闭原则实现的道路。

l         接口隔离原则——应该为客户程序提供更细致具体的单独接口而不是大的总体的接口 
原创粉丝点击