Java设计模式:桥接模式

❤ 作者主页:欢迎来到我的技术博客😎
❀ 个人介绍:大家好,本人热衷于Java后端开发,欢迎来交流学习哦!( ̄▽ ̄)~*
🍊 如果文章对您有帮助,记得关注点赞收藏评论⭐️⭐️⭐️
📣 您的支持将是我创作的动力,让我们一起加油进步吧!!!🎉🎉

文章目录

  • 一、桥接模式的定义
  • 二、桥接模式的结构
  • 三、桥接模式的实现
  • 四、桥接模式的优缺点
  • 五、桥接模式的使用场景

一、桥接模式的定义

桥接模式(Bridge Pattern)是一种结构型设计模式,它将 抽象部分与其实现部分分离,使它们可以独立变化。桥接模式通过将抽象和实现分离,使得它们可以独立演化,互不影响。这种模式通过组合而不是继承的方式来实现抽象与实现的解耦。


二、桥接模式的结构

桥接模式包含以下的重要角色:

  • 抽象角色(Abstraction): 定义了抽象类的接口,维护一个指向实现部分的引用。抽象部分的主要责任是将客户端的请求委派给实例化角色,并可以包含一些自己的业务逻辑。抽象角色可以是抽象类或接口。
  • 具体抽象角色(Refined Abstraction): 扩展了抽象角色定义的接口,通常是对抽象角色的更具体的实现。具体抽象角色的变化不影响实现部分。
  • 实例化角色(Implementor): 定义了实现类的接口,供具体的实现类实现。实例化角色通常是一个接口,它与抽象角色的接口可能不完全一致。实例化角色的变化不影响抽象角色。
  • 具体实例化角色(Concrete Implementor): 实现了实例化接口的具体类。具体实现部分是抽象角色的实际执行者,它的变化不影响抽象角色。

三、桥接模式的实现

需求案例:在生活中使用遥控器来控制电视机,不同品牌的电视机有不同的功能和操作方式。而遥控器上的按钮则负责执行一些基本的功能,如开关、音量调节、频道切换等。

这里的桥接模式体现在遥控器和电视机之间的关系。具体的遥控器(抽象角色)可以独立于具体的电视机(实例化角色)变化,而新增一种电视机或遥控器不会影响到另一方。

  • 抽象角色 - 遥控器按钮: 包括开关按钮、音量调节按钮、频道切换按钮等。
  • 实例化角色 - 电视机: 包括不同品牌的电视机,如三星、索尼等。

使用桥接模式实现上述案例。类图如下:
在这里插入图片描述
 
具体的类设计如下:

实例化角色(电视):

public interface TV {void turnOn(); //打开电视void changeChannel(int channel); //切换频道void turnOff(); //关闭电视
}

具体实例化角色(三星电视机):

public class SamsungRemote extends RemoteControl {public SamsungRemote(TV tv) {super(tv);}@Overridepublic void control(Integer channel) {tv.turnOn();tv.changeChannel(channel);tv.turnOff();}
}

具体实例化角色(索尼电视机):

public class SonyTV implements TV {@Overridepublic void turnOn() {System.out.println("电视已打开!");}@Overridepublic void changeChannel(int channel) {System.out.println("电视已切换到" + channel + "频道");}@Overridepublic void turnOff() {System.out.println("电视已关闭!");}
}

抽象角色(遥控器):

public abstract class RemoteControl {protected TV tv;public RemoteControl(TV tv) {this.tv = tv;}public abstract void control(Integer channel);
}

具体抽象角色(三星遥控器):

public class SamsungRemote extends RemoteControl {public SamsungRemote(TV tv) {super(tv);}@Overridepublic void control(Integer channel) {tv.turnOn();tv.changeChannel(channel);tv.turnOff();}
}

具体抽象角色(索尼遥控器):

public class SonyRemote extends RemoteControl  {public SonyRemote(TV tv) {super(tv);}@Overridepublic void control(Integer channel) {tv.turnOn();tv.changeChannel(channel);tv.turnOff();}
}

客户端类:

public class Client {public static void main(String[] args) {System.out.println("------使用三星电视机------");SamsungRemote samsungRemote = new SamsungRemote(new SamsungTV());samsungRemote.control(5);System.out.println("------使用索尼电视机------");SonyRemote sonyRemote = new SonyRemote(new SonyTV());sonyRemote.control(10);}}

测试结果如下:
在这里插入图片描述
 
可以看到,这样设计的好处在于,遥控器和电视机两个维度可以独立变化,新增一种电视机或遥控器不会影响到另一方,符合桥接模式的思想。


四、桥接模式的优缺点

优点:

  1. 解耦抽象和实现: 桥接模式通过将抽象部分和实现部分分离,使它们可以独立变化。这降低了它们之间的耦合度,使系统更灵活。
  2. 多维度扩展: 桥接模式支持多维度的扩展。可以轻松地新增新的抽象部分或实现部分,而不影响已有的部分,提高了系统的可扩展性。
  3. 简化继承体系: 桥接模式避免了采用多层次的继承体系,减少了类之间的耦合。通过组合和委托关系,代码更易于理解、扩展和维护。
  4. 提高可维护性: 分离抽象和实现部分使得代码更清晰、可读性更好。通过合理的组织结构,增加了代码的可维护性。

缺点:

  1. 增加系统复杂性: 在小规模系统中,桥接模式可能显得过于繁琐,增加了代码的复杂性。只有在系统中存在多个变化维度,并且这些维度需要独立变化时,桥接模式才更有价值。
  2. 引入抽象和实现的额外复杂性: 引入抽象和实现部分的分离可能会增加设计的复杂性,特别是在对系统有深刻理解之前。
  3. 需要正确识别变化维度: 如果无法正确识别系统中存在的变化维度,就难以设计出合适的抽象和实现分离的结构,可能导致不必要的复杂性。

五、桥接模式的使用场景

桥接模式适用于以下场景:

  1. 多维度变化: 当一个类存在多个独立变化的维度,且这些维度需要独立扩展时,使用桥接模式可以有效地将它们分离,使系统更灵活。
  2. 抽象和实现的解耦: 当需要避免在抽象部分和实现部分之间建立静态的继承关系时,桥接模式提供了一种更加灵活的设计方式,可以通过组合和委托来实现抽象和实现的解耦。
  3. 多继承结构: 当系统中的类层次结构存在多层继承,而且这种多层次的继承关系导致类的数量爆炸性增长时,桥接模式可以减少继承层次,使系统更加清晰、易于理解和维护。
  4. 不同维度的独立变化: 当系统中的不同维度的变化需要独立进行时,桥接模式可以有效地应对这种情况,使得各个维度的变化互不影响。
  5. 可插拔的组件: 桥接模式可以用于设计可插拔的组件,即可以在运行时动态地选择和切换抽象和实现部分,而不影响客户端代码。

 
非常感谢您阅读到这里,如果这篇文章对您有帮助,希望能留下您的点赞👍 关注💖 分享👥 留言💬thanks!!!

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

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

相关文章

R语言系列4——R语言统计分析基础

目录 写在开头1. 描述性统计分析1.1 描述性统计分析的定义与重要性1.2 R语言中的描述性统计分析功能1.3 常用的描述性统计量及其在R中的计算方法1.4 使用R语言进行描述性统计分析的实际示例1.5 描述性统计分析的局限性和应用注意事项 2. 假设检验基础2.1. 假设检验的基本原理和…

力扣hot100题解(python版69-73题)

69、有效的括号 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应…

浅易理解:YOLOv1

You Only Look Once: Unified, Real-Time Object Detection (读原英文版YOLOv1 ,让我更深刻理解YOLO内容,保留部分原英文译文) Abstract 2015年YOLO团队提出了一种名为YOLO的新目标检测方法。以往的目标检测工作大多将分类器转用…

leetcode刷题(javaScript)——堆相关场景题总结

堆是什么?堆都能用树表示,并且一般树的实现都是利用链表。平时使用的最多的是二叉堆,它可以用完全二叉树表示,二叉堆易于存储,并且便于索引。在堆的实现时注意:因为是数组,所以父子节点的关系就…

气膜建筑是由什么材料制成的?PVDF膜材的革新应用值得期待吗?

随着科技的不断进步和发展,建筑行业也在不断涌现新型的建筑材料。气膜建筑作为其中一种创新的建筑膜材,在体育馆、运动场馆、展览厅等场所得到了广泛的应用。那么,究竟是什么材料构成了气膜建筑呢?轻空间小编将为您详细介绍。 气膜…

Python数值方法在工程和科学问题解决中的应用

💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 随着计算机技术的不断发展,Python作…

《行业指标体系白皮书》重磅发布,剖析指标建设困境,构建前瞻性的指标体系(附下载)

正处于企业指标建设过程中的你,是否经常遇到这样的问题: • 各个部门独立建设信息系统,由此产生的指标定义和计算方式各异,导致管理层无法快速准确地掌握整体业务运行状况 • 缺乏对指标的统一管理和规范,产生重复的指…

OPCUA 学习笔记:程序模型

无论是边缘控制器,还是PLC 中,除了信息模型之外,还有应用程序,这些程序可能是IEC61131-3 编写的程序,也可能是其它程序开发的可执行程序。 尽管OPCUA 描述模型能力很强,但是它缺乏算法的描述方式。但是OPCU…

欧盟地区 iOS DMA 更新后,Brave浏览器安装量激增

自《欧洲数字市场法案》发布后,苹果公司为遵守该法案,在 iOS 17.4 中引入了一项新功能,要求欧盟用户从包括 Brave 在内的列表中选择一个默认网络浏览器。 用户在安装更新后首次打开 Safari 时,会弹出一则消息提示用户从本国流行的…

【C++教程从0到1入门编程】第九篇:STL中Vector类

一、vector的介绍 1.vector的介绍 vector是表示可变大小数组的序列容器。 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的&…

js的异常处理

1、throw抛异常 throw抛出异常信息,程序也会终止执行; throw后面跟的是错误提示信息; new Error() 配个throw使用,能设置更详细的错误信息。 function counter(x,y) {if (!x || !y) {throw new Error(参数不能为空)}retu…

技术上的现货黄金开户可以免一下吗?

现货黄金是国际市场上的电子黄金合约买卖,是一种自由而灵活的投资方式,投资者可以根据自己对行情的判断选择交易的方向,只要成功的抓住了一点市场波动,就可以借助杠杆的作用,把它转化为较大的收益。 现货黄金实行保证金…