设计模式的定义
设计模式是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解、提高代码的可读性
设计模式的基本要素
- 模式名称
- 问题
- 描述了应该在何时使用模式,它包含了设计中存在问题以及问题存在的原因
- 解决方案
- 描述了设计模式的组成部分,以及这些组成部分之间的相互关系,各自的职责和协作方式
- 对于每一个设计模式,必须掌握其类图,理解类图中每一个角色的意义以及他们之间的关系,同时需要掌握实现该模式的一些核心代码,以便于在实践开发中合理应用设计模式
- 效果
设计模式的分类
创建型模式
| 模式类别 | 模式名称 | 模式说明 |
|---|
| 创建型模式 | 简单工厂模式(Simple Factory) | 根据传入的参数即可返回所需的对象,而无需指定它们具体的类 |
| 创建型模式 | 抽象工厂模式(Abstract Factory) | 提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类 |
| 创建型模式 | 建造者模式(Builder) | 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 |
| 创建型模式 | 工厂方法模式(Factory Method) | 将类的实例化操作延迟到子类中完成,即由子类来决定究竟应该实例化哪一个类 |
| 创建型模式 | 原型模式(Prototype) | 通过给出一个原型对象来指明所要创建的对象的类型,然后通过复制这个原型对象的方法创建出更多同类型的对象 |
| 创建型模式 | 单例模式(Singleton) | 确保在系统中某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例 |
结构型模式
| 模式类别 | 模式名称 | 模式说明 |
|---|
| 结构型模式 | 适配器模式(Adapter) | 提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类 |
| 结构型模式 | 桥接模式(Bridge) | 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 |
| 结构型模式 | 组合模式(Composite) | 将类的实例化操作延迟到子类中完成,即由子类来决定究竟应该实例化哪一个类 |
| 结构型模式 | 装饰模式(Decorator) | 动态的给一个对象增加一些额外的职责 |
| 结构型模式 | 外观模式(Facade) | 为复杂子系统提供一个统一的入口 |
| 结构型模式 | 享元模式(Flyweight) | 通过运用共享技术有效地支持大量细粒度对象的复用 |
| 结构型模式 | 代理模式(Proxy) | 给某一个对象提供一个代理,并由代理对象控制原对象的引用 |
行为型模式
| 模式类别 | 模式名称 | 模式说明 |
|---|
| 行为型模式 | 责任链模式(Chain of Responsibility) | 避免请求发送者和接收者耦合在一起,让多个对象都有可能接受请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止 |
| 行为型模式 | 命令模式(Command) | 将一个请求封装为一个对象,从而使得请求调用者和请求接收者解耦 |
| 行为型模式 | 解释器模式(Interpreter) | 描述如何为语言定一个文法,如何在该语言中表示一个句子,以及如何解释这些句子 |
| 行为型模式 | 迭代器模式(Iterator) | 提供一个方法来访问聚合对象,而不用暴露这个对象的内部表示 |
| 行为型模式 | 中介者模式(Mediator) | 通过一个中介对象来封装一系列的对象交互,使得各对象之间不需要显式的相互引用,从而解耦,而且可以独立哦对改变它们之间的交互 |
| 行为型模式 | 备忘录模式(Memento) | 在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态 |
| 行为型模式 | 观察者模式(Observer) | 定义了对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相互依赖对象皆得到通过并被自动更新 |
| 行为型模式 | 状态模式(State) | 允许一个对象当其内部状态改变时改变它的行为 |
| 行为型模式 | 策略模式(Strategy) | 定义一系列算法,并将每一个算法封装在一个类中,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化 |
| 行为型模式 | 模板方法模式(Template Method) | 定义一个操作中算法的框架,而将一些步骤延迟到子类中 |
| 行为型模式 | 访问者模式(Visitor) | 表示一个作用于某对象中的各元素的操作,它使得用户可以在不改变元素的类的前提下定义作用于这些元素的新操作 |