产生背景

设计模式最初是出现在建筑设计里的名词, 后来被应用在软件设计之中
本次设计模式介绍的是GOF的《设计模式:可复用面向对象软件的基础》里面包含23种设计模式,一直复用至今

基本要素

  1. 模式名称:模式名称有助于我们理解和记忆该模式
  2. 问题:问题描述了该模式的应用环境, 即何时该使用该模式
  3. 解决方案 : 模式问题的解决方案包括 设计的组成成分、它们之间的相互关系及各自的职责和协作方式
  4. 效果: 效果就是使用该设计模式需要权衡的问题,即模式的优缺点, 主要是对时间和空间上的衡量, 以及该模式对系统的灵活性 ,扩展性,可移植性的影响, 显示的列出这些东西对理解模式有很大的帮助


GOF的23种设计模式

根据目的来分

创建型模式

用于描述怎样创建对象, 它主要的特点是将对象的创建与使用进行隔离


结构型模式

用于描述 如何将对象或类按照某种布局组成更大的结构

行为型模式

用于描述类或对象之间如何相互协作,完成单个类或对象无法完成的任务,以及如何分配职责

范围\目的 创建型模式 结构型模式 行为型模式
类模式 工厂方法 (类)适配器 模板方法、解释器
对象模式 单例
原型
抽象工厂
建造者
代理
(对象)适配器
桥接
装饰
外观
享元
组合
策略
命令
职责链
状态
观察者
中介者
迭代器
访问者
备忘录

根据作用范围来分

根据模式是主要用于类上还是主要用于对象上来分,这种方式可分为类模式和对象模式两种。

类模式

用于处理类与子类之间的关系,这些关系通过继承来建立,是静态的, 在编译时刻便确定下来了

对象模式

用于处理对象之间的关系,这些关系可以通过组合, 聚合来实现,在运行的时候是可变的, 更具灵活性

组合跟聚合的含义

组合和聚合是有很大区别的,这个区别不是在形式上,而是在本质上:
比如A类中包含B类的一个引用b,当A类的一个对象消亡时,b这个引用所指向的对象也同时消亡(没有任何一个引用指向它,成了垃圾对象),这种情况叫做组合,反之b所指向的对象还会有另外的引用指向它,这种情况叫聚合。
现实生活中:
人和手,脚是组合关系,因为当人死亡后人的手也就不复存在了。人和他的电脑是聚合关系。
可以说聚合是一种强组合的关系

GOF的23种设计模式

1.单例模式(Singleton)

一个类一次只能生产一个实例, 该类提供了一个全局访问点共外外界访问,其拓展就是有限多例模式

2.原型模式(Prototype)

将一个对象最为原型, 通过对其进行复制, 来克隆出多个与原型类似的实例

3.工厂方法模式(Factory Method)

定义一个用于创建产品的接口, 由其实现类来决定创建什么样的对象

4.抽象工厂模式(AbstractFactory)

提供一个创建产品族的接口, 其每个子类可以生产一系列的产品

5.建造者(Builder)模式

将一个复杂的的对象分解成多个相对简单的部分,然后根据不同的需求创建他们, 最后再将他们组装起来

6.代理(Proxy)模式

客户端通过代理来访问对象,而不是直接访问对象

7.适配器(Adapter)模式

将一个接口变为客户端需要的接口的样子, 使两个原本不能一起工作的接口能一起工作

8.桥接(Bridge)模式

将抽象与现实分离,用组合的关系来代替集成, 降低耦合性

9.装饰(Decorator)模式

动态的给对象增加一些职责,使得对象的功能更丰富

10.外观(Facade)模式

为多个复杂的子系统提供一个一致的访问接口, 使得这些接口更容易被访问

11.享元(Flyweight)模式

通过共享技术来有效的支持对大颗粒度对象的复用

12.组合(Composite)模式

将对象组合成树桩接口, 使得用户对单一对象跟对组合对象具有一直的访问性

13.模板方法(TemplateMethod)模式

指定了固定的算法结构, 结构的某些实现内容由子类来实现, 使得子类在不改变算法结构的情况下重新定义算法结构的某些特定的步骤

14.策略(Strategy)模式

定义了一系列的算法, 每个算法都独立封装,使他们可以相互替换, 替换的时候不影响使用方使用

15.命令(Command)模式

将请求封装成一个对象, 将发出请求的责任跟执行请求的责任分割

16.职责链(Chain of Responsibility)模式

将请求从链中的一个对象传到另一个对象, 知道请求被响应 , 这样来降低耦合性

17.状态(State)模式

允许一个对象在其内部状态发生改变是,改变其行为

18.观察者(Observer)模式

对象存在一对多的关系, 当一个对象的内部状态发生改变的时候,会将这个信息通知给其他的对象, 使其他的对象也做出对应的改变

19.中介者(Mediator)模式

使用一个中介对象来降低原来对象之间的耦合度, 使得原来的对象之间不必互相了解

20.迭代器(Iterator)模式

提供一种方法来顺序的访问对象的数据,而不暴露对象的结构

21.访问者(Visitor)模式

再不改变集合元素的情况下, 为每个对象提供多个访问方式

22.备忘录(Memento)模式

在不破坏封装性的前提下, 查询并保存对象的内部状态,以便以后恢复它

23.解释器(Interpreter)模式

提供如何定义语言的文法,以及对语言句子的解释