桥接模式 VS 装饰器模式、状态模式 VS 策略模式的微妙之处

简介: 本文简述了桥接模式(Bridge Pattern)和装饰器模式(Decorator Pattern),以及状态模式(State Pattern)和策略模式(Strategy Pattern)的微妙之处,以及它们之间是如何“看起来就像另一者的”。

桥接模式 VS 装饰器模式、状态模式 VS 策略模式的微妙之处


Foundations of Software Engineering 的 Design Pattern 学习笔记整理

关键词:设计模式、桥接模式、装饰器模式、状态模式、策略模式( Design Pattern, Bridge Pattern, Decorator Pattern, State Pattern, Strategy Pattern)


本文简述了桥接模式(Bridge Pattern)和装饰器模式(Decorator Pattern),以及状态模式(State Pattern)和策略模式(Strategy Pattern)的微妙之处,以及它们之间是如何“看起来就像另一者的”。


桥接是指能够沿着不同的维度(along distinct dimensions)以多种方式(in more than one way)来指定一个对象,通常使用子类型(sub-typing)和注入(injection)


new BoldText("blah blah", new UTF16Encoding))
new ItalicsText("blah blah", new ASCIIEncoing))
// where BoldText and ItalicsText are subclasses of Text and UTF16Encoding and ASCIIEncoding are subclasses of TextEncoding


装饰器是指能够以一种任意的方式向一个对象添加特征(responsibilities, embellishments, or features),通常使用包装(wrapping)


装饰器所描述的是一种 specialization,但是有着截然不同的机制,并且可以创建的变化不一定是不同维度的(variations you can create are not points on distinct dimensions):在同一维度上,多个特征可以同时添加到一个对象上。使用装饰器模式需要依赖继承,但是子类型却并不特殊化目标对象(subtyping does not specialize the target object),我们可以使用包装来完成这个事情(injection it into a higher level object (wrapper) does the trick)。


new Underlined(new Italics(new Bold(new Text("blah blah")))).


在上面这个例子中,我们可以使用装饰器模式将 blah blah 变成斜体的、加粗的、带下划线的表示,但是不能使用桥接模式将这段文本变成既是加粗又是斜体的,因为 Bold 和 Italics 都是同一个维度下的分化(specializations along the style dimension),你必须选择其中之一。同样,UTF16 和 ASCII 是编码维度下的不同分化,你也必须选择其中之一。


如果你想用桥接模式创建一个既是粗体、又是斜体的风格,那么你就必须定义一个名为 BoldAndItalicsText 的 Text 的子类,这显得不合理是吗?是的,所以,你就会意识到,粗体、斜体当然是可以被一起使用的,因为它们是特征,而不是单一维度下面的不同分化,所以你需要的其实是装饰器模式,而不是桥接模式。


再来回顾一下这个使用桥接模式的经典例子:在一个维度上,我们有 NoSQL DB、SQL DB 和 Mock DB,它们是单一维度下的不同分化,而在另一个维度上,我们有 Backlog DB 和 Product DB 等。


状态模式和策略模式意外地有着类似的类图,但是它们的意图是不同的。


状态不仅仅表达了在运行时去改变一个对象的行为,它更加强调的是一个对象能够识别它自己的内部状态并相应地改变它的行为(也可能是改变它的状态,因此需要在对象内部实现一个状态机)。


作为策略模式的典型例子,我们会在一个机器人对象中注入一个不同的防撞策略,这时我们并没有更改机器人的内部状态,所以这仅仅是选了不同的策略。当我们在一个项目经理对象中注入一个不同的报告生成过滤器时,我们没有改变内部状态,只是改变了在任何状态下的报告的打印策略。


但是,如果需要一台自动售货机在有足够的钱存入时与钱不够时表现不同,这就是关于状态的了。自动售货机在有足够资金的时候会切换状态,并且在每个状态下只能执行某些行为。


因此,意图在设计模式中是很重要的。不同的意图意味着,不同的选择。

目录
相关文章
|
1月前
|
数据采集 缓存 API
1688 API 实战指南:搞定批发场景的 3 大核心难题(附签名代码与避坑清单)
本文深入解析了1688 API 在批发场景下的三大核心难题及解决方案,涵盖签名机制、商品数据处理与订单同步等高频问题,提供可复用代码与避坑清单,助你高效对接1688平台。
|
SQL 分布式计算 NoSQL
【SQL 审核查询平台】Archery使用介绍
【SQL 审核查询平台】Archery使用介绍
872 0
【SQL 审核查询平台】Archery使用介绍
|
XML 数据库 数据格式
Spring5入门到实战------14、完全注解开发形式 ----JdbcTemplate操作数据库(增删改查、批量增删改)。具体代码+讲解 【终结篇】
这篇文章是Spring5框架的实战教程的终结篇,介绍了如何使用注解而非XML配置文件来实现JdbcTemplate的数据库操作,包括增删改查和批量操作,通过创建配置类来注入数据库连接池和JdbcTemplate对象,并展示了完全注解开发形式的项目结构和代码实现。
Spring5入门到实战------14、完全注解开发形式 ----JdbcTemplate操作数据库(增删改查、批量增删改)。具体代码+讲解 【终结篇】
|
11月前
|
PHP
20241125易支付PHP网站源码
PHP74,上传源码后解压访问域名/install 进行安装 安装完成 之后一定要设置伪静态 源码里面nginx.txt 就是伪静态 然后复制粘贴到伪静态里面保存即可
293 2
|
域名解析 网络协议 调度
阿里云移动研发平台EMAS支持纯血鸿蒙HarmonyOS NEXT
阿里云移动研发平台EMAS作为面向应用全生命周期提供一站式的应用研发管理服务产品,其核心产品包括云构建,HTTPDNS 和移动推送正式推出了针对纯血鸿蒙的SDK版本,将为广大开发者在鸿蒙生态中构建高效、稳定、可靠的企业级应用提供强有力的支持。如有疑问,请进入钉钉群(群号35248489)进行相关咨询。
ly~
|
传感器 存储 供应链
大数据在供应链管理中的具体应用案例
以下是大数据在供应链管理中的具体应用案例:沃尔玛通过整合内外部数据进行需求预测,提前调配应急物资;亚马逊利用大数据优化库存管理,提高周转率并降低成本;DHL通过传感器收集数据优化物流路线,提升运输效率。大数据的优势在于提高需求预测准确性、优化库存管理、提升物流效率、增强供应商管理和提高供应链可视性,从而实现全方位的供应链优化。
ly~
2983 2
|
11月前
|
设计模式 程序员
从零到一:我的编程之旅与技术感悟
【10月更文挑战第22天】这是一篇关于个人编程学习经历和技术感悟的文章。文章以通俗易懂的语言,讲述了作者从一个编程新手,通过不断学习和实践,逐渐成长为一名熟练的程序员的过程。文章不仅分享了学习编程的方法和技巧,还深入探讨了编程的本质和意义,对于想要学习编程的人来说,具有很好的启发和指导作用。
133 2
|
供应链 监控 搜索推荐
ERP系统中的订单管理与供应链协作解析
【7月更文挑战第25天】 ERP系统中的订单管理与供应链协作解析
983 6
|
编解码 Windows
FFmpeg开发笔记(二十九)Windows环境给FFmpeg集成libxvid
XviD是开源MPEG-4视频编码器,与DivX相似但后者非开源。早期MP4常使用XviD或DivX编码,现已被H.264取代。在Windows上集成FFmpeg的XviD编解码库libxvid,需访问<https://labs.xvid.com/source/>下载源码,解压后在MSYS环境中配置、编译和安装。之后重新配置FFmpeg,启用libxvid并编译安装。详细步骤包括configure命令、make和make install。成功后,通过`ffmpeg -version`检查是否启用libxvid。更多音视频开发技术可参考《FFmpeg开发实战:从零基础到短视频上线》。
292 0
FFmpeg开发笔记(二十九)Windows环境给FFmpeg集成libxvid
|
存储 关系型数据库 MySQL
MySQL数据库——索引(2)-B+Tree、Hash结构,索引分类(聚集索引、二级索引)
MySQL数据库——索引(2)-B+Tree、Hash结构,索引分类(聚集索引、二级索引)
250 1