1 介绍
- GoF是指Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides四个人,他们四个人被称为Gang of Four,缩写GoF。这四个人曾经合著过一本书《Design Patterns: Elements of Reusable Object-Oriented Software》,也就是大名鼎鼎的《设计模式》一书。此书流传很广,已经是程序员界的圣经之一了。这本书中介绍了23种设计模式,虽然设计模式其实不止这23种,但是由于这23种太常用了,所以我们一般说到设计模式,就是指GoF的23种设计模式。本文后续说的设计模式也将默认设计模式为GoF的23种设计模式。
2 六大原则
所有的设计模式都遵循以下六个基本的设计原则。
- 单一职责原则SRP(Single Responsibility Principle)
是指一个类的功能要单一,不能包罗万象。如同一个人一样,分配的工作不能太多,否则一天到晚虽然忙忙碌碌的,但效率却高不起来。 - 开放封闭原则OCP(Open-Close Principle)
一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。比如:一个网络模块,原来只服务端功能,而现在要加入客户端功能,那么应当在不用修改服务端功能代码的前提下,就能够增加客户端功能的实现代码,这要求在设计之初,就应当将服务端和客户端分开,公共部分抽象出来。 - 里式替换原则LSP(the Liskov Substitution Principle LSP)
子类应当可以替换父类并出现在父类能够出现的任何地方。比如:公司搞年度晚会,所有员工可以参加抽奖,那么不管是老员工还是新员工,也不管是总部员工还是外派员工,都应当可以参加抽奖,否则这公司就不和谐了。 - 迪米特法则
迪米特法则又叫最少知识原则Least Knowledge Principle(LKP),意思是一个类应该对他自己所依赖的类知道的越少越好!最终实现高内聚,低耦合。 - 接口分离原则ISP(the Interface Segregation Principle ISP)
模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来 - 依赖倒置原则DIP(the Dependency Inversion Principle DIP)
不要依赖具体实现,要依赖抽象!也就是面向“接口”编程而不是面向实现类编程!这样做可以解除客户端与实现类的耦合。
3 三大分类
GoF23种设计模式一般分为三大类
3.1 设计模式分类
3.1.1 创建型模式
创建型模式,就是创建对象的模式,抽象了实例化的过程。
它帮助一个系统独立于如何创建、组合和表示它的那些对象。
关注的是对象的创建,创建型模式将创建对象的过程进行了抽象,也可以理解为将创建对象的过程进行了封装,作为客户程序仅仅需要去使用对象,而不再关心创建对象过程中的逻辑
- 工厂方法模式(Factory Method)
- 抽象工厂模式(Abstract Factory)
- 单例模式(Singleton)
- 创建者模式(Builder)
- 原型模式(Prototype)
3.1.2 结构型模式
结构型模式是为解决怎样组装现有的类,设计他们的交互方式,从而达到实现一定的功能的目的。
结构型模式包容了对很多问题的解决。例如:扩展性(外观、组成、代理、装饰)封装性(适配器,桥接)。
- 适配器模式(Adapter)
- 外观模式(Facade)
- 享元模式(Flyweight)
- 组合模式(Composite)
- 装饰器模式(Decorator)
- 代理模式(Proxy)
- 桥接模式(Bridge)
3.1.3 行为型模式
行为型模式涉及到算法和对象间职责的分配。
行为模式描述了对象和类的模式,以及它们之间的通信模式。
行为型模式刻划了在程序运行时难以跟踪的复杂的控制流可分为行为类模式和行为对象模式
- 策略模式(Strategy)
- 状态模式(State)
- 职责链模式(Chain of Responsibility)
- 观察者模式(Observer)
- 模板方法模式(Template Method)
- 命令模式(Command)
- 备忘录模式(Memento)
- 迭代器模式(Iterator)
- 调停者模式(Mediator)
- 解释器模式(Interpreter)
- 访问者模式(Visitor)