读《大话设计模式》

2023-12-17 23:30:28

ref

《大话设计模式》

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

uml类图

工厂模式

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

在这里插入图片描述

策略模式

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

单一职责原则

开放-封闭原则

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

依赖倒转原则

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

装饰模式

  • 动态地给一个对象添加额外的职责
  • 有效地把类的核心职责和装饰功能区分开, 去除重复装饰逻辑
    在这里插入图片描述

代理模式

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

工厂方法模式

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

在这里插入图片描述
在这里插入图片描述

原型模式

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

在这里插入图片描述

模板方法模式

  • 将不变行为搬移到父类, 去除子类的重复代码
    在这里插入图片描述

迪米特法则

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

外观模式

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

在这里插入图片描述

建造者模式

  • (生成器模式):将一个产品的内部表象与生成过程分开, 用户只需指定需要建造的类型, 无需知道具体建造过程和细节
  • 应用: 创建一些复杂的对象, 这些对象内部构件建造顺序很稳定, 但对象内部构建常面临复杂的变化
    在这里插入图片描述

观察者模式

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

在这里插入图片描述

抽象工厂模式

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

在这里插入图片描述

16.状态模式

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

在这里插入图片描述

17.适配器模式

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

在这里插入图片描述

18.备忘录模式

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

在这里插入图片描述

19.组合模式

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

在这里插入图片描述

20.迭代器模式

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

在这里插入图片描述

21.单例模式

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

22.桥接模式

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

在这里插入图片描述

在这里插入图片描述

23.命令模式

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

在这里插入图片描述

24.职责链模式

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

在这里插入图片描述

25.中介者模式 Mediator

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

26.享元模式 Flyweight

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

在这里插入图片描述

27.解释器模式 interpreter

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

在这里插入图片描述

28.访问者模式 Visitor

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

在这里插入图片描述

文章来源:https://blog.csdn.net/weixin_46143152/article/details/135051747
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。