设计模式:七大原则

  • 开闭原则
  • 依赖倒置原则
  • 单一职责原则
  • 接口隔离原则
  • 迪米特法则(最少知道原则)
  • 里氏替换原则
  • 合成/复用原则

UML类图

#:protected
~:默认,包权限
下划线:static
斜体:抽象方法

image

开闭原则

image
类应该对扩展开放,对修改关闭。

扩展就是添加新功能的意思,因此该原则要求在添加新功能时不需要修改代码。

符合开闭原则最典型的设计模式是装饰者模式,它可以动态地将责任附加到对象上,而不用去修改类的代码。

依赖倒置原则

高层次模块不应该依赖于低层的
image

例如扩展的时候是面向ICourse接口的,而不是在Geely类中添加study方法,main函数也不需要调用Geely的对象的具体课程方法。

大概是:不要写很多不同名字的实现方法,而是去写很多类去继承接口,然后传不同的参数来调用不同类,这些类里的方法名字相同,但实现不同。

单一职责原则

修改一个类的原因应该只有一个。
换句话说就是让一个类只负责一件事,当这个类需要做过多事情的时候,就需要分解这个类。
如果一个类承担的职责过多,就等于把这些职责耦合在了一起,一个职责的变化可能会削弱这个类完成其它职责的能力。

image

接口隔离原则

不应该强迫客户依赖于它们不用的方法。
因此使用多个专门的接口比使用单一的总接口要好。

image

迪米特原则

对象对其他对象保持最少的了解,所以少用public
尽量降低类之间的耦合
只和朋友交流(入参出参、成员变量。。其他内部出现的类不是朋友,尽量搞出去)

里氏替换原则

image

image

子类能够替换父类。
重载时,子类的入参要比父类宽松。
返回 时,子类要更严格。

合成/复用原则

image

黑箱复用。

下面类图中描述的例子。“人”被继承到“学生”、“经理”和“雇员”等子类。而实际上,学生”、“经理”和“雇员”分别描述一种角色,而“人”可以同时有几种不同的角色。比如,一个人既然是“经理”,就必然是“雇员”;而“人”可能同时还参加MBA课程,从而也是一个“学生”。使用继承来实现角色,则只能使每一个“人”具有Is-A角色,而且继承是静态的,这会使得一个“人”在成为“雇员”身份后,就永远为“雇员”,不能成为“学生”和“经理”,而这显然是不合理的。
image

这一错误的设计源自于把“角色”的等级结构和“人”的等级结构混淆起来,把“Has-A”角色误解为“Is -A”角色。因此要纠正这种错误,关键是区分“人”与“角色”的区别。下图所示的的设计就正确的做到了这一点。
image