设计模式整理—设计原则
设计原则
先复习一下6大设计原则,对他们的理解
单一职责(SRP Single Responsibility Principle)
一个类或一个方法只有一个职责,尽量做到只有一个行为原因引起变化。
理解:
- 降低类的复杂度,一个类只负责一项职责。
- 提高类的可读性,可维护性
- 降低变更引起的风险
- 通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则;只有类中
方法数量足够少,可以在方法级别保持单一职责原则
接口隔离原则(ISP Interface Segregation Principle)
客户端不应该依赖它不需要的接口,一个类对另一个类的依赖应该建立在最小接口上。
理解:一些接口内聚性不够,可能同时做了很多事情。这时候需要拆分让每个接口恰好做一件事。有的接口从逻辑上确实是一件事但是还可以细分这取决于一个度(根据需求推敲出的度)。如果逻辑上实在分不出来,可以从二八原则上来区分,同一个接口中80%时候使用的方法与20%时候使用的方法是可以分开的。来增加灵活性,它的意义就是省去了必须要去实现一些不需要实现的接口。同时接口隔离也能降低里式替换原则中担心的替换、修改父类对子类的影响。还有这也符合迪米特法则,不该知道的就无需知道,否则一旦调用了无需实现的接口方法存在一定的风险。
依赖倒置原则(DIP Dependence Inversion Principle)
1)高层模块不应该依赖底层模块,二者都应该依赖抽象
2)抽象不应该依赖与细节,细节应该依赖抽象
3)中心思想是面向接口编程
4)理念:相对于细节的多变性,抽象稳定得多。以抽象为基础搭建的架构比以细节搭建的架构稳定的多
5)使用接口或抽象类的目的是制定好规范,而不涉及具体的操作,把展现细节交给实现类去完成。
里氏替换原则(LSP liskov substitution principle)
子类可以扩展父类的功能,但不能改变原有父类的功能,
理解:继承带来便利的同时,也增加了侵入性。使耦合性增强了,如果要修改一个类那么必须要考虑到对它的子类的影响。所以里式替换指出:子类尽量不要重写父类的方法。适当情况下可以通过聚合、组合等方式来解决问题。
迪米特法则(LoD Law of Demeter)
1)直接的朋友:出现在方法参数、方法返回值、成员变量中的是直接的朋友;出现在局部变量中的不是直接的朋友。只与朋友通信。
2)一个对象应该对其他对象保持最小的了解。一个类对自己依赖的类知道的越少越好,尽量将逻辑封装在类的内部,对外除了提供public方法外不透露任何信息。
3)理解:通过访问权限,类无需暴露自己的缺陷给外部;观察直接的朋友,这些都是可以通过依赖倒置原则使用抽象来替换的部分;另外重要的是确认你真正的朋友,并且只和朋友说话,不和陌生人说话,对哪些应该是朋友,哪些不应该是朋友需要重点划分。
开闭原则(OCP Open Source Principle)
对扩展开放(对提供方),对修改关闭(对使用方)。
理解:设计模式的核心就是为了管控变化。最理想的形式就是增加、修改了功能后,使用方无需变化或者只需要新增而其他的不变。不可避免的是肯定会有功能的修改,要做的就是去找出稳定的部分,通过统一的调用位置来管控能预测到的变化,让稳定的部分不受影响,让变化的部分能够快速支持。