news 2026/4/18 1:20:02

Head First设计模式(十四) 设计原则 其他的模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Head First设计模式(十四) 设计原则 其他的模式

桥接(Bridge)

使用桥接模式不只改变你的实现,也改变你的抽象。

优点

  1. 解耦实现,不再永久绑定到接口
  2. 抽象和实现可以独立扩展
  3. 针对“具体的抽象类”变化,不会影响客户

用途和缺点:

  1. 在跨多个平台的图形和窗体系统中很有用
  2. 当你需要以不同的方式改变接口和实现时,桥接很好用
  3. 缺点是增加了复杂度

生成器(Builder)

使用生成器模式来封装一个产品的构造过程,并允许按步骤构造

优点:

  1. 封装复杂对象的构造方式
  2. 允许对象用多个步骤构造,并且可以改变过程(和一步到位的工厂不同)
  3. 向客户隐藏产品的内在表现
  4. 产品的实现可以被替换,因为客户只看到抽象的接口

用途和缺点:

  1. 经常被用来建造组合结构
  2. 和使用工厂相比,构造对象需要更多客户的领域知识

责任链(Chain of Responsibility)

当你要把一个处理请求的计划给予多于一个的对象时,使用责任链模式

优点:

  1. 解耦请求的发送者和接收者
  2. 简化你的对象,因为它不需要知道链的结构以及保持对其成员的直接引用
  3. 允许你通过改变链的成员或次序,动态地添加或移除责任

用途和缺点:

  1. 经常用在窗体系统中,处理鼠标点击和键盘事件
  2. 并不保证请求一定会被执行;如果没有对象处理它,可能会掉到链的末尾(这可以是优点或缺点)
  3. 运行时可能会难以观察和调试

蝇量(Flyweight)

当某个类的一个实例可以用于提供许多虚拟实例时,使用蝇量模式

优点:

  1. 减少运行时对象实例的数目,节省内存
  2. 把许多“虚拟”对象的状态集中放进一个地方

用途和缺点:

  1. 当一个类有许多实例,而这些实例能够用一致的方法控制时,用蝇量
  2. 蝇量模式的一个缺点在于,一旦你实现了它,那么类的单个逻辑实例,将无法拥有和其他实例不同的独立行为

解释器(Interpreter)

使用解释器模式为语言建造解释器

优点:

  1. 将每一个语法规则表达成一个类,使得语言容易实现
  2. 因为语法由类表达,你可以轻易地改变或扩展该语言
  3. 通过在类结构中添加方法,可以添加解释之外的新行为,例如打印格式的美化和更复杂的程序验证

用途和缺点:

  1. 当你需要实现一门简单的语言时,使用解释器
  2. 当你有一个简单的语法,而且简单比效率重要时,适合用解释器
  3. 用于脚本和编程语言
  4. 当语法规则的数目很大时,这个模式可能变得笨重。在这种情况下,一个解析器/编译器的生成器可能更适合

中介者(Mediatro)

使用中介者模式来集中相关对象之间复杂的沟通和控制方式

优点:

  1. 通过将中介者支持的对象从系统中解耦,增加对象的复杂度
  2. 通过将控制逻辑集中,简化了系统的维护
  3. 简化以及减少系统中对象之间发送的消息的变化

用途和缺点:

  1. 中介者常用于协调相关的GUI组件
  2. 中介者模式的一个缺点是,如果设计不当,中介者对象本身会变得过度复杂

备忘录(Memento)

当你需要让对象返回之前的某个状态时,例如,你的用户请求“撤销”,使用备忘录模式

优点:

  1. 保持被保存的状态处于关键对象外面,有助于维护内聚
  2. 保持关键对象的数据封装
  3. 提供容易实现的恢复能力

用途和缺点:

  1. 备忘录用于保存状态
  2. 使用备忘录的一个缺点是,保存和恢复状态可能相当耗时
  3. 在Java系统中,考虑使用序列化(Serialization)来保存系统的状态

原型(Prototype)

当创建给定类的实例昂贵或复杂时,使用原型模式

优点:

  1. 向客户隐藏制作新实例的复杂性
  2. 提供一种选择,让客户生成类型未知的对象
  3. 在某些环境下,复制对象比创建新对象更有效

用途和缺点:

  1. 在一个复杂的类层次中,当系统必须创建许多类型的新对象时,应该考虑原型
  2. 使用原型的缺点是,对象的复制有时候相当复杂

访问者(Vistor)

当你想要为一个对象组合增加能力,且封装不重要时,使用访问者模式

优点:

  1. 允许你添加操作到组合结构,而不改变结构本身
  2. 添加新操作相对容易
  3. 由访问者执行的操作的代码被集中化了

用途和缺点:

  1. 使用访问者模式时,组合类的封装被打破
  2. 因为涉及到导游的功能,因此组合结构更加难以变化
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 7:57:35

YOLOv8模型可解释性研究:Grad-CAM热力图生成

YOLOv8模型可解释性研究:Grad-CAM热力图生成 在智能监控系统中,一个看似可靠的AI模型突然将路边广告牌上的人物海报识别为“入侵者”,触发警报。运维人员百思不得其解:是光照干扰?还是模型出现了逻辑偏差?这…

作者头像 李华
网站建设 2026/4/17 13:45:59

YOLOv8 Neck部分设计亮点:PAN-FPN的作用

YOLOv8 Neck部分设计亮点:PAN-FPN的作用 在现代目标检测系统中,模型的精度与速度之争从未停歇。而当我们谈论YOLO系列为何能在实时性要求严苛的场景下依然保持领先时,除了Backbone的优化和Head的解耦设计外,Neck结构的设计往往才是…

作者头像 李华
网站建设 2026/4/8 16:07:30

QListView滚动性能优化策略:深度剖析

QListView 滚动卡顿?别急,这才是真正的性能调优实战指南你有没有遇到过这样的场景:程序刚启动时还好好的,可一旦加载几万条日志、成千上万首歌曲或大量图片缩略图,QListView就开始“喘气”——滚动一顿一顿的&#xff…

作者头像 李华
网站建设 2026/4/11 18:22:55

YOLOv8 Swagger文档生成方法

YOLOv8 与 Swagger:构建可交互的智能视觉 API 在智能制造、智慧安防和自动驾驶等领域,目标检测模型早已不再是实验室里的“玩具”,而是真正驱动业务决策的核心组件。然而,当算法工程师在一个 Jupyter Notebook 中跑通了 YOLOv8 模…

作者头像 李华
网站建设 2026/3/13 8:46:41

YOLOv8自动锚点计算功能:AutoAnchor机制介绍

YOLOv8自动锚点计算功能:AutoAnchor机制介绍 在目标检测的实际项目中,一个看似不起眼的细节——锚框(anchor boxes)的设计,往往能显著影响模型最终的表现。尤其是在面对非标准场景时,比如无人机航拍图中的微…

作者头像 李华
网站建设 2026/4/18 7:58:19

YOLOv8 EarlyStopping功能开启方法:防止过拟合

YOLOv8 EarlyStopping功能开启方法:防止过拟合 在目标检测的实际项目中,一个常见的困扰是:模型在训练集上越跑越好,mAP不断上升,loss持续下降,可一旦拿到验证集或真实场景中测试,效果却开始“掉…

作者头像 李华