0%

23种设计模式

GOF-23模式分类

从目的来看

  • 创建型:解决对象创建的工作
  • 结构型:解决对象变化时对结构的冲击
  • 行为型:解决多个类在交互时责任划分的问题

    从范围来看

  • 类模式:父子类的静态关系(继承关系)
  • 对象模式:对象间的动态关系(组合关系)

从封装变化角度对模式分类

组件协作

定义通过晚期绑定实现框架与应用间的松耦合

模板方法

  • 解决问题:框架的设计,固定一部分不变的代码在抽象类中
  • 实现方法:多态,先写一个框架,对于变化部分用虚函数下放至子类实现

策略模式

  • 解决问题:情况的扩展,应对超出原有设定的情况(switch)
  • 实现方法:
    • 设置所有情况的父类,
    • 各情况分别各自实现子类,
    • 调用时使用工厂模式的接口构成出对应情况的子类
  • 特点:替代switch,if-else,实现策略的扩展性,还可以节省代码空间,运行依赖代替编译依赖

观察者模式

  • 解决问题:建立通知依赖关系(例如Qt的信号与槽),从而实现松耦合
  • 实现方法:
    • 设计通知抽象类,包含绑定方法,解绑方法,通知方法,被通知队列,通知方法中加入一个循环,用于通知每个绑定者
    • 设计接收抽象类,包含事件处理方法
    • 构造通知对象,接收对象,调用通知对象的绑定方法,把接收对象指针传入,实现二者的绑定
  • 特点:本质上其实一种回调的形式,只是以往C传的是的函数指针,C++传的是对象指针

    事件模式

    单一职责

    桥 模式

    对象创建

    绕开new 避免对象创建时的紧耦合(依赖具体类)

工厂方法模式

  • 解决问题:把构造对象,这个的变化点往“上”抛,从而使变化集中在某一层面,
  • 应对情况:对象必须在本层次创建,且对象需要多态性
  • 实现方法:
    • 设计工厂抽象基类,包含创建对象方法
    • 为A类设计A工厂类去,A工厂类的唯一用途用于创建A类对象
    • 创建A类工厂,并用工厂基类指针(多态),传入需要调用的层次
    • 在调用层次中,调用工厂基类的创建方法(实际上调用的是A工厂类的创建方法),创建出A类对象,并附以基类指针
  • 特点:本质上实现了一种多态new,c++内核机制是没有的,工厂模式在代码层面将其实现,与直接传指针不同的是,构造函数触发的时间不同

    抽象工厂

    原型模式

    构建器

    对象性能

    接口隔离

    状态变化

    数据结构

    行为变化

    邻域问题