设计模式六大原则
1. 单一职责原则(Single Responsibility Principle, SRP)
单一职责原则是指一个类只负责一个功能领域中的相应职责,职责越多,复用的可能性越低,耦合度越高,是实现高内聚、低耦合的指导原则。
2. 开闭原则(Open-Closed Principle, OCP)
开闭原则是指一个软件实体应该对扩展开放,对修改关闭,即尽量在不修改已有代码的基础上进行扩展。
开闭原则中的软件实体可以是一个模块、一个多个类组成的局部结构或一个独立的类。
抽象化是开闭原则的关键。
3. 里式替换原则(Liskov Substitution Principle, LSP)
里式替换原则是指所有引用父类的地方必须能够透明地使用其子类对象,即将父类对象引用替换成子类对象是合法的,但是将子类对象引用替换成父类对象是非法的。
里式替换原则是实现开闭原则的重要方式之一。
使用里式替换原则时需要注意:
(1) 子类所有方法必须在父类中声名,或子类必须实现父类中声名的所有方法
(2) 尽量将父类定义为接口或抽象类
4. 依赖倒置原则(Dependency Inversion Principle, DIP)
依赖倒置原则是指抽象不应该依赖于细节,细节应当依赖于抽象,可以理解为面向接口编程。
依赖倒置原则要求传递参数时或关联关系中尽量引用抽象层类(接口或抽象类),使用抽象层类进行变量类型声名、参数类型声名、方法返回类型声名及数据类型转换等,尽量避免使用具体类完成这些工作。
5. 接口隔离原则(Interface Segregation Principle, ISP)
接口隔离原则提出使用多个专门的接口,而非单一的总接口,客户端不应该依赖那些它并不需要的接口。
根据接口隔离原则,当一个接口很大时,需要将其进一步分割为一些更小的接口。每个接口应当承担一种相对独立的角色。
这里的接口有两种不同的含义:
(1) 一个类型所具有的所有方法特征集合,属于逻辑上的抽象。此时接口的划分直接带来类型的划分,可以将接口理解为角色,一个接口只能代表一个角色,每个角色都有其特定的一个接口,这种原则也被成为【角色隔离原则】
(2) 特定于某种语言的接口定义,如 Java 中的 Interface。此时接口仅仅提供客户端需要的行为,客户端将不要的行为隐藏起来,应当为客户端提供尽可能小的单独的接口,不要提供一个大的总接口。
使用接口隔离原则时需要注意控制接口的粒度,即不能太大也不能太小,太大会未被接口隔离原则,灵活性差,使用起来不方便,太小又会导致接口泛滥,不利于维护。
6. 迪米特法则(Law of Demeter,LoD)
迪米特法则源自 1987 年美国东北大学(Northeastern University)的 Demeter 研究项目,又称为【最少知识原则】(Least Knowledge Principle,LKP)。
迪米特法则的定义:一个软件实体应当尽可能少地与其它实体发生相互作用
符合迪米特法则的系统中某一模块发生改变时会尽量少地影响其它模块,利于系统的扩展。
迪米特法则限制软件实体间通信的宽度和深度,有利于降低系统耦合,使类之间保持松散的耦合关系。
迪米特法则要求在设计系统时尽量减少对象间的交互,如果两个对象之间不需要直接通信,那么这两个对象就不应该发生任何直接的相互作用。如果其中一个对象需要调用另一个对象的某一方法,可以通过第三方转发此调用,即通过合理引入第三方降低现有对象间的耦合度。
迪米特法则接受的对象通讯包括:
(1) 当前对象自身(this)
(2) 以参数形式传入到当前对象方法中的对象
(3) 当前对象的成员
(4) 如果当前对象集合成员中元素
(5) 由当前对象创建的其它对象
迪米特法则要求不要与除以上对象外的其它对象直接交互。
运用迪米特法则时需要注意:
(1) 尽量创建送耦合的类,类之间的耦合度越低越利于复用,修改处于松耦合中的类不会对关联类造成太大影响;
(2) 设计类时尽量降低其成员变量和方法的访问权限
(3) 尽量将类设计为不可变,不允许被继承
(4) 应当将对其它对象的引用降到最低