开闭原则
一个软件如 类, 模块和函数应该对扩展开放, 对修改关闭
用抽象构建框架, 用实现扩展实现
优点: 提供软件系统的可复用性及可维护性.
依赖倒置原则
高层模块不应该依赖底层模块, 二者都应该依赖其抽象
抽象不应该依赖细节, 细节应该依赖抽象.
针对接口编程, 不要针对实现编程.
优点: 可以减少类间的耦合性, 提高系统稳定性, 提高代码可读性和可维护性, 可减低修改程序所造成的风险
单一职责原则
不要存在多于一个导致类变更的原因
一个类/ 接口/ 方法只负责一项职责
优点: 降低类的复杂度, 提高类的可读性, 提高系统的可维护性, 降低变更引起的风险
单一职责原则接口隔离原则
用多个专门的接口, 而不使用单一的总接口, 客户端不应该依赖它不需要的接口
-
一个类对另一个类的依赖应该建立在最小的接口上
-
建立单一接口, 不要建立庞大臃肿的接口
-
尽量细化接口, 接口中的方法尽量少
-
注意适度原则, 一定要适度
-
提高内聚, 尽量减少对外的交互
优点: 符合我们常说的高内聚低耦合的设计思想, 从而使得类具有很好的可读性, 可扩展性和可维护性.
接口隔离原则迪米特原则(最少知道原则)
一个对象应该对其他对象保持最少的了解, 又叫最少知道原则
尽量降低类和类之间的耦合
强调只和朋友交流, 不和陌生人说话.
朋友: 出现在成员变量, 方法的输入/输出参数中的类称为成员朋友类, 而出现在方法体内部的类不属于朋友类.
优点: 降低类之间的耦合
迪米特原则(最少知道原则)合成/复用原则
尽量使用组合,尽量不要使用继承
组合
由于组合可以将已有的对象纳入到新对象中,使之成为新对象的一部分,因此新对象可以调用已有对象的功能
优点
- 新对象存取成分对象的唯一方法是通过成分对象的接口。
- 这种复用是黑箱复用,因为成分对象的内部细节是新对象所看不见的。
- 这种复用支持包装。
- 这种复用所需要的依赖较少。
- 每一个新的类可以将焦点集中到一个任务上。
- 这种复用可以在运行时间动态进行,新对象可以动态的引用与成分对象类型相同的对象。
缺点
就是用组合复用建造的系统会有较多的对象需要管理。
继承
组合几乎可以用到任何环境中去,但是继承只能用到一些环境中。
继承复用通过扩展一个已有对象的实现来得到新的功能,基类明显的捕获共同的属性和方法,而子类通过增加新的属性和方法来扩展超类的实现。
优点:
- 新的实现比较容易,因为基类的大部分功能都可以通过继承自动的进入子类。
- 修改或扩展继承而来的实现较为容易。
缺点:
- 继承复用破坏了包装,因为继承超类的的实现细节暴露给子类。由于超类的内部细节常常对子类是透明的,因此这种复用是透明的复用,又称“白箱”复用。
- 如果超类的实现发生改变,那么子类的实现也不得不发生改变。因此,当一个基类发生改变时,这种改变就会像水中投入石子引起的水波一样,将变化一圈又一圈的传导到一级又一级的子类,使设计师不得不相应地改变这些子类,以适应超类的变化。
- 从超类继承而来的实现是静态的,不可能在运行时间内发生改变,因此没有足够的灵活性。
网友评论