读《大话设计模式》

文章目录

  • ref
  • 工厂模式
  • 策略模式
  • 单一职责原则
  • 开放-封闭原则
  • 依赖倒转原则
  • 装饰模式
  • 代理模式
  • 工厂方法模式
  • 原型模式
  • 模板方法模式
  • 迪米特法则
  • 外观模式
  • 建造者模式
  • 观察者模式
  • 抽象工厂模式
  • 16.状态模式
  • 17.适配器模式
  • 18.备忘录模式
  • 19.组合模式
  • 20.迭代器模式
  • 21.单例模式
  • 22.桥接模式
  • 23.命令模式
  • 24.职责链模式
  • 25.中介者模式 Mediator
  • 26.享元模式 Flyweight
  • 27.解释器模式 interpreter
  • 28.访问者模式 Visitor

ref

《大话设计模式》

c++解决vscode cmd 输出中文乱码
system(“chcp 65001\n”); // Execute command line command chcp 65001

读《大话设计模式》_第1张图片

工厂模式

  • 不是GoF设计模式中正式的一员, 被认为是设计模式的起点
  • 通过一个专门的类(工厂类)来创建产品对象, 客户端通过工厂类的静态/非静态方法传入参数, 工厂类根据参数决定创建什么产品
  • 优点: 对象的创建和使用进行分离, 客户端无需关心具体产品实现, 只需知道产品接口
  • 缺点: 增加新产品时需修改工厂类代码, 不符合开闭原则

读《大话设计模式》_第2张图片

策略模式

  • 定义一系列算法的方法, 以相同的方式调用所有算法(殊途同归), 减少各种算法类和使用算法类之间的耦合
  • 优点
    • 有助于析取这些算法的公共功能
    • 简化了单元测试

单一职责原则

开放-封闭原则

  • 对扩展开放, 对更改封闭

依赖倒转原则

  1. 高层模块不应该依赖低层模块, 两个都应该依赖抽象
  2. 抽象不应该依赖细节, 细节应该依赖抽象 ( 针对接口编程, 不对实现编程)
  • 里氏代换原则: 软件不分辨父类对象和子类对象, 子类型必须能替换其父类型

装饰模式

  • 动态地给一个对象添加额外的职责
  • 有效地把类的核心职责和装饰功能区分开, 去除重复装饰逻辑
    读《大话设计模式》_第3张图片

代理模式

  • 应用
    • 远程代理: 为一个对象在不同地址空间提供局部代表, 隐藏它在不同地址空间的事实()
    • 虚拟代理: 根据需要创建开销很大的对象, 通过其存放实例化需要长时间的真实对象(网页先加载文字后加载图片)
    • 安全代理: 控制真实对象访问时的权限(对象应有不同访问权限)
    • 智能指引: 调用真实对象时, 代理处理另外一些事
      读《大话设计模式》_第4张图片

工厂方法模式

  • 定义一个用于创建对象的接口, 让子类决定实例化哪个类
  • 优点: 符合开闭原则, 新增产品只需添加新工厂类不修改已有代码
  • 缺点: 客户端需要知道具体工厂类,

读《大话设计模式》_第5张图片
读《大话设计模式》_第6张图片

原型模式

  • 用原型实例指定创建对象的种类, 通过拷贝这些原型创建新的对象
  • (从一个对象再创建另一个可定制的对象, 且无需知道任何创建细节)

读《大话设计模式》_第7张图片

模板方法模式

  • 将不变行为搬移到父类, 去除子类的重复代码
    读《大话设计模式》_第8张图片

迪米特法则

  • 最少知识原则: 如果两个类不必彼此通信, 两个类就不应发生直接的相互作用. 若一个类需调用另一个类某方法, 可通过第三者转发该调用

外观模式

  • 为子系统的一组接口提供一个一致的界面, 让其更容易使用

读《大话设计模式》_第9张图片

建造者模式

  • (生成器模式):将一个产品的内部表象与生成过程分开, 用户只需指定需要建造的类型, 无需知道具体建造过程和细节
  • 应用: 创建一些复杂的对象, 这些对象内部构件建造顺序很稳定, 但对象内部构建常面临复杂的变化
    读《大话设计模式》_第10张图片

观察者模式

  • 发布-订阅(Publish/Subscribe)模式, 定义了一种一对多的依赖关系, 让多个观察者同时监听某对象, 对象变化时通知所有观察者
  • 特点: 解耦, subject改变, 所有Observer都得到通知

读《大话设计模式》_第11张图片

抽象工厂模式

  • 提供一个接口, 创建相关/依赖对象的家族, 无需明确指定具体类
  • 优点: 一系列相关产品进行组合, 客户端无需关心具体工厂和产品, 降低客户端与具体实现的耦合
  • 缺点: 难以支持新种类产品
  • 没看完

读《大话设计模式》_第12张图片

16.状态模式

  • 当一个对象内在状态改变时允许改变其行为, 看起来像改变了其类
  • 当一个对象行为取决于其状态, 且必须在运行时刻根据状态改变行为时使用
  • 优点: 将特定状态相关的行为局部化, 将不同状态的行为分隔开

读《大话设计模式》_第13张图片

17.适配器模式

  • 将一个类的接口转换为客户希望的另一个接口, 解决接口兼容问题

读《大话设计模式》_第14张图片

18.备忘录模式

  • 不破坏封装性前提下, 捕获一个对象内部状态, 在该对象外保存状态
  • 适用于功能复杂但要维护/记录属性历史的类 / 保存属性只是众多属性小部分

读《大话设计模式》_第15张图片

19.组合模式

  • 将对象组合成树形结构表示部分-整体的层次结构, 用户对单个对象和组合对象的使用有一致性

读《大话设计模式》_第16张图片

20.迭代器模式

  • 提供一种方法顺序访问一个聚合对象的各个元素, 不暴露对象的内部表示

读《大话设计模式》_第17张图片

21.单例模式

  • 保证一个类仅有一个实例, 提供一个访问它的全局访问点. 构造方法私有化

22.桥接模式

  • 将抽象部分与其实现部分分离, 使其都可以独立变化(实现系统可能有多角度分类, 每种分类都可能变化, 将这种多角度分离让其独立变化, 减少耦合)
    合成/聚合复用原则: 尽量用合成/聚合,尽量不用继承
  • 优点: 助于每个类被封装, 集中在单个任务上, 类和类层次会保持较小规模, 不会过度增长

读《大话设计模式》_第18张图片

读《大话设计模式》_第19张图片

23.命令模式

  • 将一个请求封装为一个对象, 从而使可用不同请求对客户进行参数化: 对请求排队/请求日志/支持可撤销的操作
  • 优点: 分离请求操作的对象与执行操作的对象
    • 容易设计命令队列
    • 容易记入日志
    • 允许接受请求一方决定是否否决请求
    • 容易实现请求撤销和重做
    • 容易新增具体命令类

读《大话设计模式》_第20张图片

24.职责链模式

  • 使多个对象都有机会处理请求, 避免请求的发送者和接收者的耦合关系. 将该对象连成一条链, 沿该链传递请求, 直到有对象处理它
  • 优点:
    • 接收者和发送者都没有对方的明确信息, 链中对象不清楚链的结构, 简化对象的相互连接, 降低耦合

读《大话设计模式》_第21张图片

25.中介者模式 Mediator

  • (调停者模式) 用一个中介对象来封装一系列的对象交互, 让对象无需显式相互引用, 耦合松散, 可独立改变其之间交互
  • 通常应用于一组对象以定义良好但复杂的方式进行通信的场合
  • 优点:
    • 容易在系统中应用
  • 缺点:
    • 中介类最复杂
      读《大话设计模式》_第22张图片

26.享元模式 Flyweight

  • 用共享技术有效支持大量细粒度对象, 避免大量类似的开销
    • 在程序设计中, 有时需要生成大量细粒度的类实例表示数据, 如果能发现这些实例除了几个参数外基本相同, 则将不同的参数移到类实例的外面, 在方法调用时传递进来, 就可以通过共享大幅度减少单个实例的数目
  • 内部状态: 在享元对象内部且不随环境改变而改变的共享部分
  • 外部状态: 随环境改变而改变的, 不可以共享的状态
  • 使用场景:
    • 若一个应用使用了大量对象, 这些对象造成了很大的内存开销时考虑使用;
    • 对象大多数状态可以外部状态, 删除外部状态可用较少的共享对象取代多组对象

读《大话设计模式》_第23张图片

27.解释器模式 interpreter

  • 给定一个语言, 定义其文法的一种表示, 定义一个解释器, 使用该表示来解释语言中的句子
    • 当一个语言需要解释执行, 该语言的句子可表示为一个抽象语法树
  • 特点: 容易改变和扩展文法,
  • 缺点: 为文法的每一条规则至少定义一个类, 包含多规则的文法可能难以管理维护

读《大话设计模式》_第24张图片

28.访问者模式 Visitor

  • 表示一个作用于某对象结构中的各元素的操作, 可在不改变各元素的类的前提下定义作用于这些元素的新操作
  • 作用: 目的要把处理从数据结构分离, 使算法操作的增加变得容易

读《大话设计模式》_第25张图片

你可能感兴趣的:(设计模式,c++)