用最少的语言记住更多的东西

本文提纲

七大原则

设计模式的目的

高内聚,低耦合

  1. 可重用性
  2. 可扩展性
  3. 可阅读性
  4. 可靠性

1. 单一职责原则(SRP)

单一职责原则提出了一个编写程序的标准,用”职责“或”变化原因“来衡量接口或类设计得是否优良。

Single Responsibility Principle

一个类(方法)只描述一件事, 应该有且仅有一个原因引起的变更。

There should never be more than one reason for a class to change(一个类的变化不应该有一个以上的原因引起)

单一职责原则好处

  1. 类的复杂性降低,实现什么职责都有清晰明确的定义
  2. 可读性提高,复杂性降低,那当然可读性提高了。
  3. 可维护性提高,可读性提高,那当然更容易维护了。
  4. 变更引起的风险降低。变更是必不可少的,如果接口单一职责做得好,一个接口修改只对相应的实现类有影响,对其它接口无影响,这对系统的扩展性,维护性都有非常大的帮助。

2. 开闭原则(OCP)

Open Closed Principle

3W原则: What 是什么,Why为什么,How怎么做。

对修改关闭,对扩展开放

3. 接口隔离原则(ISP)

Interface Segregation Principle

定义单一接口,不要建立臃肿庞大的接口。

  1. 客户端不应该依赖它不需要的接口
  2. 类间的依赖关系应该建立在最小接口上

接口隔离原则拆分接口时,首先必须满足单一职责原则

  1. 接口要高内聚
    1. 少使用public方法,接口对外承诺越少,对系统开发越有利,变更的风险也就越少,同时也有利于降低成本。
  2. 定制服务
    1. 就是单独为一个个体提供优良的服务。
    2. 只提供访问者需要的方法。
  3. 接口设计 是有限度的
    1. 接口的设计粒度越小,系统越灵活
  4. 一个接口只服务于一个子模块或业务逻辑。

接口隔离原则与单一职责原则的区别

接口隔离原则要求接口中的方法尽量少,专门的接口。

单一职责原则注重的是职责,是业务逻辑上的划分。

4. 里氏替换原则(LSP)

Liskov Substitution Principle

基类出现的地方子类也可以出现; 反过来就不行,有子类出现的地方,父类未必就能适应。

  1. 在使用继承时,遵循里氏替换原则,在子类中尽量不要重写父类方法。
  2. 继承实际上就增加了耦合性,给程序带来侵入性。在适当情况下,尽量使用聚合,组合,依赖来解决问题。
  3. 父类中凡是已经实现好的方法,实际上是在设定规范和契约

5. 依赖倒置原则(DIP)

Dependence Inversion Principle

面向接口编程(OOD),而不是面向实现编程。

  1. 高层模块不应该依赖低层模块,两者都应该依赖其抽象
  2. 抽象不应该依赖细节
  3. 细节应该依赖抽象

低层模块:每一个逻辑的实现都是由原子逻辑组成的, 不可分割的原子逻辑就是低层模块。

高层模块:原子逻辑的再组装就是高层模块

抽象:就是接口或抽象类,两种都是不能直接被实例化的

细节:就是实现类,实现接口或抽象类而产生的类就是细节,其特点就是可以直接被实例化。

抽象是对实现的约束,对依赖者而言,也是一种契约,不仅仅约束自己,同时也约束与外部的关系。其目的是保证所有细节不脱离契约的范畴。


依赖的三种写法:

依赖是可以传递的。只要做到抽象依赖,即使是多层的依赖传递也无所畏惧。

  1. 构造函数传递依赖对象
  2. Setter 方法传递依赖对象
  3. 接口声明依赖对象

什么是倒置

先说”正置“就是类依赖实现类的依赖,倒置即依赖抽象类,而不是依赖实现类。


*注:*依赖倒置原则是实现开闭原则的重要途径。依赖倒置原则没有实现,就别想实现对扩展开放,对修改关闭。在项目中,牢记”面向接口编程“就基本上抓住了依赖倒置的核心。

6. 迪米特原则(LKP)

也称最少知道原则 Least Knowledge Principle

不跟陌生人说话,即不能跨层访问

核心观念就是类间解耦,弱耦合,只有弱耦合了以后,类的复用率才可以提高。

  1. 是自己的就是自己的
    1. 如果一个方法放在本类中,即不增加类间关系,也对本类不产生负面影响,那就放置在本类中。
  2. 类间解耦,但解耦是有限度的。过犹不及。

7. 合成复用原则

尽量多使用组合聚合接口,而不是继承关系

参考

设计模式之禅