设计模式八:桥接模式(Bridge Pattern)

桥接模式是一种结构型设计模式,用于将抽象与实现分离,使它们可以独立地变化。桥接模式的核心思想是将一个大类或多个紧密相关的类分为两个独立的层次结构,从而实现解耦。
在桥接模式中,存在两个维度的类/对象结构:抽象部分和实现部分。抽象部分定义了高层逻辑,而实现部分则提供了底层的具体实现。通过将这两个部分分离,并使用桥接模式连接它们,可以在不修改现有代码的情况下方便地扩展和修改系统。

桥接模式包含以下角色:

  1. 抽象化(Abstraction):定义了高层逻辑的抽象部分,并持有一个对实现化对象的引用。
  2. 修正抽象化(Refined Abstraction):对抽象化进行扩展,通常在抽象化的基础上添加更多的功能。
  3. 实现化(Implementor):定义了实现部分的接口,供具体实现类去实现。
  4. 具体实现化(Concrete Implementor):实现实现化接口的具体类。

桥接模式的应用场景

桥接模式适用于需要将抽象和实现分离、独立变化并能够在运行时动态切换和扩展的场景。它能提高代码的灵活性和可扩展性,并避免类之间固定的耦合关系。

  1. 当一个类需要使用两个或多个独立变化的维度时,可以使用桥接模式。例如,在制作咖啡的例子中,咖啡杯尺寸和加料类型是两个独立变化的维度,通过桥接模式可以将它们进行解耦。
  2. 当希望避免在抽象和实现之间存在固定绑定关系时,可以使用桥接模式。桥接模式可以动态地将抽象和实现部分连接起来,使得它们可以独立地变化,而不会相互影响。
  3. 当需要在运行时切换和扩展具体实现时,可以使用桥接模式。桥接模式允许客户端在不修改代码的情况下切换实现对象,并且可以灵活地添加新的实现类。
  4. 当一个类存在多层继承结构时,可以使用桥接模式。桥接模式可以避免类爆炸问题,即类的数量成倍增长,同时也可以减少继承关系造成的代码复杂性。

桥接模式java代码实例

我们将使用桥接模式设计一个制作咖啡的设计模式。
首先,我们需要定义两个不同的维度:咖啡杯尺寸和加料类型。咖啡杯尺寸有小、中、大三种,加料类型有牛奶、糖。
首先,我们创建一个抽象类Coffee来表示咖啡,其中包含了制作咖啡的方法makeCoffee:

public abstract class Coffee {protected CoffeeSize size;protected CoffeeAdditive additive;public Coffee(CoffeeSize size, CoffeeAdditive additive) {this.size = size;this.additive = additive;}public abstract void makeCoffee();
}

然后,我们定义一个枚举类型CoffeeSize来表示咖啡杯尺寸:

public enum CoffeeSize {SMALL, MEDIUM, LARGE
}

接下来,我们定义一个接口CoffeeAdditive来表示加料类型,并声明一个添加加料的方法

addAdditive:
public interface CoffeeAdditive {void addAdditive();
}

然后,我们分别创建两个实现CoffeeAdditive接口的具体类MilkAdditive和SugarAdditive:

public class MilkAdditive implements CoffeeAdditive {@Overridepublic void addAdditive() {System.out.println("Adding milk");}
}public class SugarAdditive implements CoffeeAdditive {@Overridepublic void addAdditive() {System.out.println("Adding sugar");}
}

最后,我们创建具体的咖啡类CupOfCoffee继承自抽象类Coffee,并实现makeCoffee方法:

public class CupOfCoffee extends Coffee {public CupOfCoffee(CoffeeSize size, CoffeeAdditive additive) {super(size, additive);}@Overridepublic void makeCoffee() {System.out.print("Making a " + size + " cup of coffee. ");additive.addAdditive();}
}

现在,我们可以使用这些类和接口来制作不同种类的咖啡了:

public class Main {public static void main(String[] args) {Coffee smallCoffeeWithMilk = new CupOfCoffee(CoffeeSize.SMALL, new MilkAdditive());Coffee mediumCoffeeWithSugar = new CupOfCoffee(CoffeeSize.MEDIUM, new SugarAdditive());Coffee largeCoffeeWithMilkAndSugar = new CupOfCoffee(CoffeeSize.LARGE, new MilkAdditive(new SugarAdditive()));smallCoffeeWithMilk.makeCoffee(); // 输出:Making a SMALL cup of coffee. Adding milkmediumCoffeeWithSugar.makeCoffee(); // 输出:Making a MEDIUM cup of coffee. Adding sugarlargeCoffeeWithMilkAndSugar.makeCoffee(); // 输出:Making a LARGE cup of coffee. Adding milk. Adding sugar}
}

以上就是使用桥接模式设计制作咖啡的示例。通过将咖啡杯尺寸和加料类型两个维度分开,在不同的类中进行组合,可以灵活地实现不同种类的咖啡制作。

桥接模式的优缺点

桥接模式的优点:

  1. 分离抽象和实现部分:桥接模式可以将抽象和实现部分分离,使它们可以独立地变化。这样可以降低系统的复杂度,并增加代码的可维护性和可扩展性。
  2. 提高灵活性:桥接模式允许在运行时动态切换和组合抽象和实现部分,从而提高了系统的灵活性。客户端可以在不修改代码的情况下选择不同的实现类或者组合不同的抽象和实现类。
  3. 扩展能力强:桥接模式通过引入抽象的接口,使得添加新的实现类变得简单。可以通过新增实现类来扩展系统的功能,而不需要修改已有的代码。
  4. 减少类的数量:桥接模式避免了多层继承结构导致的类爆炸问题。通过引入桥接模式,可以将多个维度的变化分解为两个独立的维度,减少了类的数量,降低了系统的复杂度。

桥接模式的缺点包括:

  1. 增加了系统的复杂度:桥接模式引入了抽象和实现两个层次的对象,增加了系统的复杂度。
  2. 增加了代码量:桥接模式会增加额外的代码量,因为需要定义抽象和实现两个层次的接口和类。
  3. 对客户端要求高:客户端需要了解抽象和实现的接口,并进行组合使用,对开发人员的要求较高。

桥接模式通过分离抽象和实现部分、提高灵活性和扩展能力等优点,能够有效地降低系统的复杂度,提高代码的可维护性和可扩展性。然而,它也带来了一些缺点,如增加了系统的复杂度和代码量,对客户端要求较高。因此,在应用桥接模式时需要权衡其优缺点并根据具体情况进行选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/20598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Liux下6818开发板(ARM)】触摸屏

(꒪ꇴ꒪ ),hello我是祐言博客主页:C语言基础,Linux基础,软件配置领域博主🌍快上🚘,一起学习!送给读者的一句鸡汤🤔:集中起来的意志可以击穿顽石!作者水平很有限,如果发现错误&#x…

Mac Navicat 16试用脚本

一、无限试用脚本如下 #!/bin/bash #/usr/libexec/PlistBuddy -c "print" ~/Library/Preferences/com.navicat.NavicatPremium.plist /usr/libexec/PlistBuddy -c "Delete :91F6C435D172C8163E0689D3DAD3F3E9" ~/Library/Preferences/com.navicat.Navica…

MacOS上用docker运行mongo及mongo-express

MongoDB简介 MongoDB 是一个基于分布式文件存储的数据库。由 C 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。 前提 要求…

高校陆续拥抱chatgpt,人工智能会给学术带来什么变化会有什么影响

在当今信息爆炸的时代,人工智能在各行各业都发挥着越来越重要的作用,高校教育领域也不例外。最近,越来越多的高校开始陆续拥抱chatgpt(Chatbot GPT)这一人工智能技术,在学术领域会带来了怎样的变化与影响&a…

【RabbitMQ(day3)】扇形交换机和主题交换机的应用

文章目录 第三种模型(Publish/Subscribe 发布/订阅)扇型(funout)交换机Public/Subscribe 模型绑定 第四、第五种模型(Routing、Topics)第四种模型(Routing)主题交换机(To…

在线五子棋对战

目录 数据管理模块(数据库设计) 前端界面模块 业务处理模块 会话管理模块网络通信模块(session,cookie) 在线管理模块 房间管理模块 用户匹配模块 项目扩展 数据管理模块(数据库设计) 数据库中有可能存在很多张表&#xf…

已注销【888】

元神密码 - 飞书云文档 (feishu.cn)

微信小程序接入腾讯云天御验证码

腾讯云新一代行为验证码(Captcha),基于十道安全防护策略,为网页、APP、小程序开发者打造立体、全面的人机验证。在保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。 …

DataSphere Studio- 1.1.1 安装部署(自动化脚本)

DSSLinkis Ansible一键安装脚本 DSS1.1.1 & Linkis 1.3.0 Ansible 一键部署脚本 作者:wubolive Q Q:1049635685 邮箱:wubolivefoxmai.com Github:https://github.com/wubolive/dss-linkis-ansible 一、简介 为解决繁琐…

flutter开发实战-时间显示刚刚几分钟前几小时前

flutter开发实战-时间显示刚刚几分钟前几小时前 在开发中经常遇到从服务端获取的时间戳,需要转换显示刚刚、几分钟前、几小时前、几天前、年月日等格式。 一、代码实现 static String timeFormatterChatTimeStamp(int seconds) {try {int nowDateSeconds (DateTi…

消息疯狂堆积!RocketMQ出Bug了?

前言 用过 MQ 的同学,可能会遇到过消息堆积的问题。而肥壕最近也踩上了这个坑,但是发现结果竟然是这么一个意料之外的原因而导致的。 正文 那一晚月黑风高,肥壕正准备踏上回家的路,突然收到告警短信轰炸!“MQ 消息堆…

微服务的基础使用

微服务 Maven的依赖冲突解决方案: 路径最短原则 配置优先原则 破坏规则则使用排除 SpringBoot场景启动器starter的开发流程 c3p0-spring-boot-starter自定义场景启动器 test-c3p0调用自定义场景启动器 SpringBoot自动装配 SpringBoot应用启动原理 nacos服务治…

nvm安装和使用

公司不同系统用的node版本不一样,所以就需要安装多版本了,那么使用nvm来管理就大大方便了开发。 使用nvm有哪些好处呢 安装node很方便,只需要一条命令可以轻松切换node版本可以多版本node并存 需要注意的是安装之前先把原有的node给卸载掉…

Mysql面试突击班索引,事务与锁

Mysql面试突击班索引,事务与锁 1.为什么Mysql要使用B树做为索引而不用B树 B树能显著减少IO次数,提高效率B树的查询效率更加稳定,因为数据放在叶子节点B树能提高范围查询的效率,因为叶子节点指向下一个叶子节点B树采取顺序读 2.…

一 关于idea如何在svn进行项目下载并运行成功

安装svn客户端 如图 安装时请选择该选项(Will be installed on local hard drive)并选择自己想要安装的目录路径 如图 svn安装成功 如图 注意 安装完成后,使用svn进行一次checkout的项目导出完成以上五步时&…

【火炬之光-召唤装备】

头部胸甲手套鞋子武器盾牌项链戒指腰带神格备注*邪龙头冠无限要塞/血抗血抗血抗***终焉复临任意攻速单手武器/黑峡烬盾1召唤等级血抗*原点的寒冬1召唤等级1.刷钢铁炼境监视者-无垢之墙升级。2.不能用典狱官的胸针参考视频机械领主无限要塞––***终焉复临––求生之欲––参考视…

TikTok马来西亚站变动,指定物流服务商!

8月2日,据TechinAsia报道,TikTok已将百世快递在马来西亚的子公司BestExpressMalaysia,指定为其在马来西亚的物流服务商。目前,百世快递已在越南、泰国与TikTok展开类似合作。 合作后,百世马来子公司将为TikTokShop卖家…

通向架构师的道路之apache_tomcat_https应用

一、总结前一天的学习 通过上一章我们知道、了解并掌握了Web Server结合App Server是怎么样的一种架构,并且亲手通过Apache的Http Server与Tomcat6进行了整合的实验。 这样的架构的好处在于: 减轻App Server端的压力,用Web Server来分压…

Python-Python基础综合案例:数据可视化 - 折线图可视化

版本说明 当前版本号[20230729]。 版本修改说明20230729初版 目录 文章目录 版本说明目录知识总览图Python基础综合案例:数据可视化 - 折线图可视化json数据格式什么是jsonjson有什么用json格式数据转化Python数据和Json数据的相互转化 pyecharts模块介绍概况如何…

sqoop

一、bg 可以在关系型数据库和hdfs、hive、hbase之间导数 导入:从RDBMS到hdfs、hive、hbase 导出:相反 sqoop1 和sqoop2 (1.99.x)不兼容,sqoop2 并没有生产的稳定版本, Sqoop1 import原理(导入) 从传统数据库获取元数据信息&…