1.概述
6大设计原则:
1)开-闭原则(open-close OCP)
2)里氏代换原则(LSP)
3)依赖倒转原则(DIP)
4)接口隔离原则(ISP)
5)组合聚合复用原则(CARP)
6)迪米特原则(LOD)
遵循这些设计原则可以有效的提高系统的可复用性,同时提高可维护性.
2.开闭原则(OCP)
含义:一个软件实体应该对扩展开发,对修改关闭。
这个原则是说设计这个模块时,应该使这个模块在不被修改的情况下得到功能扩展。
实现方案:1)抽象化.面向对象语言都实现了继承机制。可以为多个有相同作用的子类抽象出一个父类或者接口。在上下文中只针对父类或者接口编程。在扩展功能时只需要新实现一个子类,不用改动上下文,对扩展开放。父类或者接口包含了所有可能的动作,无需再修改,对修改关闭。
2)对可变性的封装.找到一个系统的可变因素,并把它封装起来。封装的结果是一种可变性不会散落在代码的不同地方;可变性和另一种可变性不能封装在一起。增加可变性不会影响系统固有行为。
尽管大部分系统都无法完全做到开闭原则,但是只要往此方向努力,做到部分符合开闭原则,系统结构也将得到改善。
3.里氏代换原则(LSP)
含义:里氏代换原则:是指一个软件实体如果使用的是一个基类,那么一定适用于子类。而且软件实体并不能区别出基类和子类。
里氏代换原则是集成复用的基石,只有符合里氏代换,增加子类才不会影响软件实体的行为。也是符合开闭原则的保障。
4.依赖倒置原则(DIP)
含义:要依赖于抽象,不要依赖于具体
开闭原则实现的关键是抽象化,并从抽象层中到处具体实现。DIP可以看做实现开闭原则的手段。所谓倒置是相较于传统设计方法,高层次依赖于低层次的模块,抽象层依赖于具体实现。
5.接口隔离原则(ISP)
含义:使用多个专门的接口优于使用单一总接口
接口并不局限于java中的接口角色,应该是一个类的提供的所有方法的特征集合,可以理解成一个类型。开闭原则中对可变性的封转,可变性也是一个接口,多种可变性最好不要封装在一起,这与ISP异曲同工。
6.合成/聚合复用原则(CARP)
含义:在一个新的对象中使用一些已有的对象,使之成为新对象中的一部分,通过向这些对象委派达到复用已有功能的作用.简单地说就是:尽量使用合成/聚合,不要使用继承。
一般情况下,只有在确定类和类之间的关系是"is A"而不是"has A"的时候才使用继承。可以和LSP配合使用。
7.迪米特法则(LoD)
含义:最少知识原则,一个对象应该对其它对象尽可能少得了解。
降低耦合是oo设计中的重要指标,LOD是降低耦合的原则。
狭义的LOD:如果两个不必彼此直接通信,那就不应该相互作用。如果其中一个要调用另一个方法,可以通过第3方调用。
广义的LOD:对对象之间的信息的流量、流向和影响的控制。模块的设计应该尽量将内部数据和实现方式封装起来,达到解耦。
8.结语
6大设计原则中开闭原则是设计的总规则,其它原则都他的实现手段和工具,附属于开闭原则。
里氏代换原则是抽象化(实现开闭原则的方法)实现的具体规范。
依赖倒转通过依赖抽象,不依赖具体实现开闭原则。
合成/聚合复用原则与里氏代换相辅相成。
一个遵循迪米特法则(最少知识法则)的模块更容易实现开闭原则。
接口隔离原则中提倡的小接口,限制了模块或者对象之间的相互依赖程度,使得模块更加容易实现开闭原则。