设计模式
为什么要学设计模式
- 有利于分析和深入了解 OOP 开源框架
- 为成为合格的架构师打下良好的基础
面向对象7大设计原则
如何同时提高一个软件系统的可维护性和可复用性是面向对象设计需要解决的核心问题之一。在面向对象设计中,可维护性的复用是以设计原则为基础的。每一个原则都蕴含一些面向对象设计的思想,可以从不同角度提升一个软件架构的设计水平
- 单一职责原则
- 开闭原则
- 里氏代换原则
- 依赖倒转原则
- 接口隔离原则
- 合成复用原则
- 迪米特法则
单一职责原则
单一职责原则(Single Responsibility Principle,SRP):一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。
单一职责原则是最简单的面向对象设计原则,它用于控制类的粒度大小
开闭原则(重要)
开闭原则(Open-closed Principle,OCP):**一个软件实体应当对扩展开放,对修改关闭。**也就是说在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即实现在不修改源代码的情况下改变这个模块的行为。
开闭原则是面向对象的可复用设计的第一块基石,它是最重要的面向对象设计原则。
抽象化是开闭原则的关键
里氏代换原则
里氏代换原则(Liskov Substitution Principle,LSP)
两种定义:
- (相对严格):如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都替换o2,程序p的行为没有发生变化,那么类型S是类型T的子类型。
- (通俗):所有引用基类(父类)的地方必须都能透明地使用其子类的对象。
开闭原则的核心是对系统进行抽象化,并且从抽象化导出具体化。
从抽象化到具体化的过程需要使用继承关系以及里氏代换原则。
依赖倒转原则(重要)
如果说开闭原则是面向对象设计的目标的话,那么依赖倒转原则就是实现面向对象设计的主要机制。依赖倒转原则是系统抽象化的具体实现。
依赖倒转必须以里氏代换原则为基础
依赖倒转原则(Dependence Inversion Principle,DIP)
定义:
- (严格):高层模块不应该依赖底层模块,它们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。
- (通俗):要针对接口编程,不要针对实现编程。
依赖注入(Dependence Injection,DI):是如何传递对象之间的依赖关系。
三种方式:
- 构造注入(Constructor Injection)
- 设值注入(Setter Injection)
- 接口注入(Interface Injection)
接口隔离原则
接口隔离原则要求我们将一些较大的接口细化,使用多个专门的接口来替换单一的总接口。
接口隔离原则(Interface Segregation Principle,ISP)
定义:
- (严格):客户端不应该依赖那些它不需要的接口。(这里的接口指的是所定义的方法)
- (通俗):一旦一个接口太大,则需要将它分割成一些更细小的接口,使用接口的客户端仅需要知道与之相关的方法即可。
合成复用原则
合成复用原则是面向对象设计中非常重要的一条原则。为了降低系类之间的耦合度,该原则提倡在复用功能时多用关联关系,少用继承关系。
合成复用原则(Composite Reuse Principle,CRP)又称为组合/聚合复用原则(Composition/Aggregate Reuse Principle,CARP)
定义:尽量使用对象组合,而不是继承来达到复用的目的。
两种方法:
- “白箱” 复用(继承)
- “黑箱” 复用(组合/聚合)
迪米特法则
迪米特法则则用于降低系统的耦合度,使类于类之间保持松散的耦合关系。
迪米特法则(Law of Demeter,LoD)又称为最少知识原则(Least Knowledge Principle,LKP)
定义:
- 不要和"陌生人"说话
- 只与你的直接朋友通讯
- 每一个软件单位对其它的单位都只有最少的知识,而且局限于那些于本单位密切联系相关的软件单位。
在迪米特法则中,对于一个对象,其朋友包括以下几类:
- 当前对象本身(this);
- 以参数形式传入到当前对象方法中的对象;
- 当前对象的成员方法;
- 如果当前对象的成员对象是一个集合,那么集合中的元素也都是朋友;
- 当前对象所创建的对象;
注意:方法调用时只能够出现一个"."(点号)