创建型 | 结构型 | 行为型 |
---|---|---|
工厂方法(Factory Method)<类> | 适配器(Adapter)<类, 对象> | 解释器(Interpreter)<类> |
抽象工厂(Abstract Factory)<对象> | 桥接(Bridge)<对象> | 模板方法(Template Method)<对象> |
建造者(Builder)<对象> | 组合(Composite)<对象> | 责任链(Chain of Responsibility)<对象> |
原型(Prototype)<对象> | 装饰者(Decorator)<对象> | 命令(Command)<对象> |
单例(Singleton)<对象> | 外观(Facade)<对象> | 迭代器(Iterator)<对象> |
享元(Flyweight)<对象> | 中介者(Mediator)<对象> | |
代理(Proxy)<对象> | 备忘录(Memento)<对象> | |
观察者(Observer)<对象> | ||
状态(State)<对象> | ||
策略(Strategy)<对象> | ||
访问者(Visitor)<对象> |
在了解设计模式之前,首先应该知道面向对象设计的6大原则,这些原则是设计模式的基础,只有理解了这些原则才能更好理解设计模式。
开闭原则(Open Closed Principle)
软件中的对象应该对扩展是开放的,但是对修改是封闭的。开闭原则的目的是尽量通过扩展软件的模块、类、方法来实现功能的变化,而不是通过修改已有的代码来完成,从而降低因为修改原有代码而给程序带来的出错率。
单一职责原则(Single Responsibility Principle)
一个类应该只有一个发生变化的原因,一个类只负责一项职责。单一职责原则有以下优点:
- 可以降低类的复杂度,一个类只负责一项职责,逻辑会比负责多项职责简单
- 逻辑简单就能提高类的可读性,并提高系统的可维护性
- 修改一个功能时减少对其他功能的影响,降低变更引起的风险
依赖倒置原则(Dependence Inversion Principle)
高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。采用依赖倒置原则可以降低类之间的耦合性,提高系统的稳定性,降低并行开发引起的风险,提高代码的可读性和可维护性。
实现依赖倒置原则通常使用构造注入、设值注入和接口注入。构造注入是通过构造函数来传入具体类的对象, 设值注入是通过Setter方法来传入具体类的对象,接口注入是通过在接口中声明的业务方法来传入具体类的对象。
接口隔离原则(Interface Segregation Principle)
客户端不应该被迫依赖于它不使用的方法,一个类对另一个类的依赖应该建立在最小的接口上。接口应该尽量细化,一个接口对应一个功能模块,同时接口里面的方法应该尽可能的少,使接口更加灵活轻便。接口分解为多个粒度小的接口,可以预防外来变更的扩散,提高系统的灵活性和可维护性。
里氏替换原则(Liskov Substitution Principle)
继承必须确保父类所拥有的性质在子类中仍然成立,也就是说子类可以扩展父类的功能,但不能改变父类原有的功能(尽量不要重写父类的方法)。里氏替换原则有以下优点:
- 里氏替换原则是实现开闭原则的重要方式之一
- 类的扩展不会给已有的系统引入新的错误,降低了代码出错的可能性
- 变更时可以做到非常好的兼容性,降低需求变更时引入的风险
迪米特法则(Law of Demeter)
迪米特法则又叫作最少知识原则(The Least Knowledge Principle),一个类对于其他类知道的越少越好。迪米特法则的意义在于降低类之间的耦合,每个类尽量减少对其他类的了解,因此系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。