跳至主要內容

《C++设计模式》视频_李建忠

LincZero大约 5 分钟

《C++设计模式》视频_李建忠

目录

23种设计模式总结

分类总结

几种分类方式

  • 从目的来看(《设计模式:可复用面向对象》中的分类)

    • 分类中译设计模式
      创建型模式
      (Creational)
      5
      抽象工厂
      构建器(生成器)
      工厂方法
      原型
      单件
      Abstract Factory
      Builder
      Factory Method
      Prototype
      Singleton
      结构型模式
      (Structural)
      7
      适配器
      桥接模式
      组成
      装饰
      外观(门面)
      享元
      代理
      Adapter
      Bridge
      Composite
      Decorator
      Facade
      Flyweight
      Proxy
      行为型模式
      (Behavioral)
      11
      职责链
      命令
      解释器(解析器)
      迭代器
      中介者
      备忘录
      观察者
      状态
      策略
      模板方法
      访问者
      Chain of Responsibility
      Command
      Interpreter
      Iterator
      Mediator
      Memento
      Observer
      State
      Strategy
      Template Method
      Visitor
  • 从范围来看

    • 类模式:处理类与子类的静态关系(偏重继承方案)
    • 对象模式:处理对象间的动态关系(偏重组合方案)
  • 从封装变化角度对模式分类(《设计模式_李建忠视频》中的分类)(其中划掉部分表示比较少用或过时)

    • 分类中译设计模式目的分类
      组件协作模板方法
      策略模式
      观察者模式
      Template Method
      Strategy
      Observer/Event
      行为型
      单一职责装饰模式
      桥接模式
      Decorator
      Bridge
      结构型
      对象创建工厂模式
      抽象工厂
      原型模式
      构建器模式
      Factory Method
      Abstract Factory
      Prototype
      Builder
      创建型
      对象性能单件模式
      享元模式
      Singleton
      Flyweight
      创建型
      结构型
      接口隔离门面模式
      代理模式
      适配器
      中介者模式
      Facade
      Proxy
      Adapter
      Mediator
      结构型
      行为型
      状态变化状态模式
      备忘录模式
      State
      Memento
      行为型
      数据结构组合模式
      迭代器模式
      职责链模式
      Composite
      Iterator
      Chain of Responsibility
      结构型
      行为型
      行为变化命令模式
      访问器模式
      Command
      Visitor
      行为型
      领域问题解析器模式Interpreter行为型

分类总结

个人分类

前面提到过可以用不同的方式对这23种设计模式进行划分和分类

包括:

  • 按目的来看(书上的3种)
  • 按封装变化角度(李建忠的9种)
  • 按范围来看(2种)
  • 按启用的原则来看(8种,但一个设计模式会涉及多种原则)
  • 按重构技法来看(5种,但一个设计模式会涉及多种原则)
  • 按中间层来看(见下)

另外,从 Java 中也有一具话叫 “没有什么是加中间层不能解决的,如果有,就再加一层”。我认为我可以以 “中间层” 为切入点,再进行分类。 缺点是这种分类偏代码向,不够本质,归纳流于表面

有两种中间层提供方法

  • a和b之间直接提供。例如
    • 工厂模式:a create b 的中间添加中间层
    • 适配器模式
  • 通过基类提供。a -> a基 -> b基 -> b,使用这种方法进行传递。 有点类似封装变化点的原则、和晚绑定的技法

总概共同特点

  • 一个目标:管理变化,提高复用!

  • 两种手段

    • 分解
    • 抽象
  • 八大原则

    • 依赖倒置原则(DIP)
    • 开放封闭原则(OCP)(开闭原则)
    • 单一职责原则(SRP)
    • 里氏代换原则(LSP)(Liskov代换原则 / 里斯科夫代换)
    • 接口隔离原则(ISP)
    • 合成复用原则(优先使用对象组合,而不是类继承)
    • 封装变化点
    • 面向接口编程,而不是面向实现编程
  • 五种重构技法

    • 静态 --> 动态
    • 早绑定 --> 晚绑定
    • 继承 --> 组合
    • 编译时依赖 --> 运行时依赖
    • 紧耦合 --> 松耦合
  • 类图的共同特点与趋向

    • 继承 --> 组合且是包含一个抽象基类的指针
    • class A:B{}(×)
    • class A{B b}(×)
    • class A{B* pb}(√)
  • 什么时候不用模式(不要盲目模式、为了模式而模式)

    • 代码可读性很差时
    • 需求理解还很浅时
    • 变化没有显现时
    • 不是系统的关键依赖点
    • 项目没有复用价值时(比如对于做外包的)
    • 项目将要发布时
  • 设计模式成长之路

    • "手中无剑,心中无剑”:见模式而不知
    • "手中有剑,心中无剑":可以识别模式,作为应用开发人员使用模式
    • "手中有剑,心中有剑":作为框架开发人员为应用设计某些模式
    • "手中无剑,心中有剑":忘掉模式,只有原则

每种设计模式的要点

常见框架中的设计模式

模板模式 Template Method

  • 这个太常见了,我就不举例了

观察者模式 Observer

  • Java中的Listener机制
  • C#的Event模式
  • Qt的single-slot机制、Model-View模式
  • Vue的核心——数据驱动视图(Observer模块)

中介者模式 Mediator

  • 类似于MVVM(Model-View-ViewModel,模型-视图-视图模型)本质上就是MVC (Model-View-Controller,模型-视图-控制器 )的改进版

  • 类似于Vue(Vue中,v-bind/ :应该用的是观察者模式,而v-model双向绑定应该是用的中介者模式)

单例模式 Singleton

  • Qt的QPluginLoader的instance()方法
  • Qt开发过程中的自定义类PluginManager也用到了这个模式

职责链模式 Chain of Responsibility

  • Android的事件分发机制
  • QT的消息传递机制

适配器模式 Adapter

  • 原生Android开发的控件有用到过