最近看到github上一个相关设计模式的笔记仓库,快速学习了一下,之前还买了《head first 设计模式》研读,但都只是读过一遍流于表面,这次重新捡起来学习学习,再结合一些其他的资料,记录一下。

设计模式被分为三个大类:

  • 创建型模式
  • 结构型模式
  • 行为型模式

其中创建型模式关注的是对象的创建,结构型模式关注的是对象的组合,行为型模式关注的是对象的交互。

创建型模式

创建型模式关注的是对象的创建,包括对象的实例化、对象的初始化、对象的销毁等。

创建型模式可以分为以下几类:

  • 工厂模式
    • 简单工厂模式: 只抽象了生产的接口,简单理解为小卖铺,用type区分不同的产品,每个产品有自己的实现类。
    • 工厂方法模式: 定义了一个创建对象的接口,但是将具体的创建工作延迟到子类中。理解为商场+专卖店,每个专卖店负责生产一种产品。
    • 抽象工厂模式: 提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。理解为迪卡侬商场+运动类型+产品,比如游泳的泳衣、泳裤,登山的登山衣、登山裤。每个运动类型都有对应负责生产一系列的衣裤产品。
  • 单例模式: 确保一个类只有一个实例,并提供一个全局访问点。一般双重检查加锁实现。
  • 建造者模式:将一个复杂对象的构建抽象,具体内部的各个部分也抽象,例如一个电脑的生产接口,内部有CPU、内存、硬盘等部分,每个部分有自己的实现类。
  • 原型模式:核心就是对象copy自己的机制。

结构型模式

结构型模式关注的是对象的组合,包括对象的组合、对象的聚合、对象的关联等。

结构型模式可以分为以下几类:

  • 适配器模式:简单,就是将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作。
  • 代理模式:包装,就是在原有的基础上添加一些额外的功能,例如权限校验、日志记录等。
  • 外观模式:封装内部的复杂实现,对外提供一个简单的接口。
  • 组合模式:将对象组合成树形结构,以表示“部分-整体”的层次结构。例如文件系统中的目录和文件,目录可以包含文件和其他目录。
  • 享元模式:享元模式是一种结构型设计模式,它通过共享对象来减少内存的使用量。例如字体包、线程池、连接池等。
  • 装饰模式:动态地给一个对象添加一些额外的职责。注意这里不是继承,而是组合。
  • 桥接模式:将抽象部分与实现部分分离,使它们都可以独立地变化。例如发送消息类型和发送消息的方式的分离,发送消息的类型有文本消息、图片消息、视频消息等,发送消息的方式有短信、邮件、微信等。底层逻辑是组合逻辑,即将发送方式抽象为消息类中的一个接入点,消息构建的时候传入发送方式的实现类参数,发送的时候调用发送方式的实现类方法。

行为型模式

行为型模式关注的是对象的交互,包括对象的通信、对象的协作、对象的职责等。

行为型模式可以分为以下几类:

  • 中介者模式:将网状结构转换为星型结构,减少对象之间的依赖关系。不过需要注意上帝对象。
  • 观察者模式:把触发方法注册到观察对象中,当观察对象发生变化时,会自动调用注册的方法。
  • 命令模式:把对象方法封装到同一个一个对象中,方便控制,例如遥控器的按钮,每个按钮都对应一个命令,点击按钮就会执行命令。
  • 迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
  • 模板方法模式:同一个流程,具体底层的实现不同。例如,一个游戏的启动流程,不同的游戏有不同的启动流程,但是都需要先加载资源,然后初始化,最后启动游戏。
  • 策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
  • 状态模式:分离了状态和行为,状态对应相关的行为类,状态的变化会导致行为的变化。
  • 备忘录模式:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。例如对象序列化、反序列化。
  • 解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
  • 责任链模式:核心实现1.接口处理逻辑2.指向下一个责任链
  • 访问者模式:结构和操作之间的分离,对象的accept接口将自己传给accept的参数,实现透传,外部的visitor拿到对象可以做相关操作。观察者模式强调事件通知机制,强调 “状态变化的传递”,而访问者模式强调操作的变化,强调 “行为变化的传递”。并且访问者模式可以在不改变对象结构的情况下,增加新的操作(新增一个visitor实现类,只要实现visit方法,即接受对象参数的方法,而不用改变对象的accept方法)。