Java设计模式 九 桥接模式 (Bridge Pattern)

桥接模式 (Bridge Pattern)

桥接模式是一种结构型设计模式,它的核心思想是将抽象部分与实现部分分离,使它们可以独立变化。这种模式通过组合而不是继承的方式来扩展功能,从而减少类之间的耦合度。


1. 模式结构

桥接模式的结构包括以下角色:

  • Abstraction(抽象类): 定义高层抽象部分,包含对实现部分(Implementor)的引用。
  • RefinedAbstraction(扩展抽象类): 继承抽象类,为高层部分提供更加具体的功能。
  • Implementor(实现接口): 定义实现类的接口,提供底层操作的抽象。
  • ConcreteImplementor(具体实现类): 实现具体的实现接口,定义底层操作的具体实现。

2. 桥接模式的优点

  1. 分离抽象与实现: 抽象部分和实现部分独立变化,降低耦合度。
  2. 扩展性强: 新增抽象部分或实现部分时无需修改已有代码,符合开闭原则。
  3. 提高灵活性: 可以动态地替换实现部分。

3. 桥接模式的缺点

  1. 增加复杂性: 分离抽象与实现后,会引入额外的类和接口。
  2. 过度设计: 如果系统不需要抽象与实现的独立扩展,使用桥接模式可能会导致不必要的设计复杂性。

4. 桥接模式的实现

示例场景:设备与遥控器

我们以“设备(电视、收音机)”和“遥控器(基础遥控器、高级遥控器)”为例,实现桥接模式。

1) 定义实现接口

定义设备的通用操作接口。

// 实现接口
public interface Device {void turnOn();void turnOff();void setVolume(int percent);int getVolume();
}
2) 实现具体设备类

具体设备类实现 Device 接口。

// 电视实现类
public class TV implements Device {private int volume = 50;@Overridepublic void turnOn() {System.out.println("TV is turned on.");}@Overridepublic void turnOff() {System.out.println("TV is turned off.");}@Overridepublic void setVolume(int percent) {this.volume = percent;System.out.println("TV volume set to " + percent + "%.");}@Overridepublic int getVolume() {return volume;}
}// 收音机实现类
public class Radio implements Device {private int volume = 30;@Overridepublic void turnOn() {System.out.println("Radio is turned on.");}@Overridepublic void turnOff() {System.out.println("Radio is turned off.");}@Overridepublic void setVolume(int percent) {this.volume = percent;System.out.println("Radio volume set to " + percent + "%.");}@Overridepublic int getVolume() {return volume;}
}
3) 定义抽象类

定义遥控器的抽象类,并持有设备接口的引用。

// 抽象遥控器
public abstract class RemoteControl {protected Device device;public RemoteControl(Device device) {this.device = device;}public void turnOn() {device.turnOn();}public void turnOff() {device.turnOff();}public void setVolume(int percent) {device.setVolume(percent);}
}
4) 实现具体遥控器

扩展遥控器的功能。

// 基础遥控器
public class BasicRemote extends RemoteControl {public BasicRemote(Device device) {super(device);}public void mute() {System.out.println("Muting the device.");device.setVolume(0);}
}
5) 客户端代码

通过桥接模式实现动态组合。

public class Client {public static void main(String[] args) {// 使用 TV 和基础遥控器Device tv = new TV();RemoteControl tvRemote = new BasicRemote(tv);tvRemote.turnOn();tvRemote.setVolume(70);((BasicRemote) tvRemote).mute();tvRemote.turnOff();// 使用 Radio 和基础遥控器Device radio = new Radio();RemoteControl radioRemote = new BasicRemote(radio);radioRemote.turnOn();radioRemote.setVolume(50);((BasicRemote) radioRemote).mute();radioRemote.turnOff();}
}
运行结果:
TV is turned on.
TV volume set to 70%.
Muting the device.
TV volume set to 0%.
TV is turned off.
Radio is turned on.
Radio volume set to 50%.
Muting the device.
Radio volume set to 0%.
Radio is turned off.

5. 桥接模式的应用场景

  1. 多维度扩展:
    当一个类有两个或多个维度的变化时,比如“形状”和“颜色”、“设备”和“遥控器”等。

  2. 避免多层继承:
    使用桥接模式可以减少类的数量,避免因为每种功能扩展都使用继承而导致的类爆炸问题。

  3. 需要动态替换实现部分:
    在运行时需要动态更换实现类时,桥接模式可以提供灵活的组合方式。


6. 桥接模式的优缺点对比

优点:
  • 分离抽象和实现: 使两者可以独立变化,增强系统的灵活性。
  • 提高扩展性: 新增抽象或实现都很容易。
  • 运行时动态组合: 可以在运行时改变实现部分,满足动态需求。
缺点:
  • 增加复杂性: 系统需要维护抽象层和实现层的多个类和接口。
  • 可能造成过度设计: 如果变化维度较少,桥接模式可能显得不必要。

7. 桥接模式与其他模式的区别

模式主要用途与桥接模式的区别
适配器模式将一个接口转换为另一个接口适配器模式用于接口兼容问题,而桥接模式用于解耦抽象和实现。
装饰器模式动态地为对象添加新功能装饰器模式关注功能增强,桥接模式关注分离抽象和实现。
抽象工厂模式创建相关的对象家族抽象工厂模式注重产品家族的创建,桥接模式注重抽象和实现解耦。

8. 总结

桥接模式是一种灵活、优雅的结构型设计模式,它通过组合的方式将抽象与实现解耦,适合多维度变化的系统。它不仅提高了系统的扩展性,还减少了类的数量,避免多层继承导致的类爆炸问题。

在实际开发中,当系统需要应对复杂的变化时,桥接模式是一个非常有效的选择。

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

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

相关文章

USB——cherry 键盘分析

文章目录 cherry USB 键盘分析描述符结构设备描述符配置描述符集合配置描述符接口 1 描述符HID 描述符端点 IN 描述符接口 2 描述符HID 描述符端点 IN 描述符端点 OUT 描述符字符串描述符语言 ID (字符串索引为 0)厂商字符串(字符串索引为 1)产品字符串(字符串索引为 2)HID 报告…

关于自动控制原理中三阶系统瞬态响应与稳定性实验的研究报告

一、引言 1.1 研究背景与意义 自动控制原理作为现代工业生产、航空航天、智能交通等众多领域的关键理论基础,对提高生产效率、提升产品质量以及保障系统安全稳定运行起着举足轻重的作用。在实际应用中,自动控制系统能够根据预设的目标和反馈信息&#…

Mybatis多条件查询:Map传参与对象传参解析

Mybatis 多条件查询常见且关键,本文探讨两种方法——Map 传参和 Java Bean 对象传参,展示用法及区别,总结应用场景和优缺点。 1. Map传参方式 原理:Mybatis允许我们通过一个Map对象来传递动态SQL中的参数。Map的键对应于SQL语句中…

vue2和vue3组件之间的通信方式差异

Vue2 vs Vue3 组件通信方法对比 1. 父子组件通信 1.1 Props 传递 Vue2 <!-- 父组件 --> <template><child-component :message"message"></child-component> </template><script> export default {data() {return {message:…

wangEditor富文本编辑器,Laravel上传图片配置和使用

文章目录 前言步骤1. 构造好前端模版2. 搭建后端存储3. 调试 前言 由于最近写项目需要使用富文本编辑器&#xff0c;使用的是VUE3.0版本所以很多不兼容&#xff0c;实际测试以后推荐使用wangEditor 步骤 构造好前端模版搭建后端存储调试 1. 构造好前端模版 安装模版 模版安…

RedisTemplate和Redisson的使用和区别

文章目录 一. 数据缓存1.1 **为什么要用缓存**1.2 缓存的实现1.3 Redis1.4 Redis 数据结构1.5 实现方式1.6 对比1.7 实现定时预热缓存1.7.1 什么是热缓存1.7.2 什么时候用缓存预热1.7.3 缓存预热带来的问题1.7.4 怎么实现缓存预热1.7.5 预热缓存的注意点1.7.6 缓存预热 - 定时任…

程朱理学基本知识

文章目录 一、儒家兴起和衰落周期二、程颐和程颢三、朱熹四、程朱理学和女性改嫁 理学根本特点就是将儒家的社会、民族及伦理道德和个人生命信仰理念&#xff0c;构成更加完整的概念化及系统化的哲学及信仰体系&#xff0c;并使其逻辑化&#xff0c;心性化、抽象化和真理化。这…

kotlin 简介

Kotlin 是一种现代化、跨平台的编程语言&#xff0c;由 JetBrains 开发&#xff0c;并于 2011 年首次发布。它可以用于多种开发场景&#xff0c;包括 Android 应用开发、后端服务开发、Web 开发&#xff0c;以及跨平台应用开发。 以下是对 Kotlin 的核心介绍&#xff1a; Kotl…

three.js+WebGL踩坑经验合集(2):3D场景被相机裁切后,被裁切的部分依然可以被鼠标碰撞检测得到(射线检测)

three.js内置了Raycaster类实现鼠标的碰撞检测&#xff0c;用它可以实现3D物体的鼠标点击&#xff0c;移入移出&#xff0c;触屏检测一类的业务功能。 该功能虽然强大&#xff0c;但同事们普遍反映不是那么好用&#xff0c;因为它不像其它配套了可视编辑的3D引擎一样&#xff…

Spring Boot spring.factories文件详细说明

优质博文&#xff1a;IT-BLOG-CN 前言&#xff1a;经常看到 spring.factories 文件&#xff0c;却没有对它进行深入的了解和分析&#xff0c;今天我们就一起揭开面纱看看它的内在。 spring.factories 文件是 Spring Boot 自动配置机制的核心部分之一。它位于每个 Spring Boo…

从前端视角看设计模式之行为型模式篇

上篇我们介绍了 设计模式之结构型模式篇&#xff0c;接下来介绍设计模式之行为型模式篇 责任链模式 责任链模式允许将请求沿着一条链传递&#xff0c;直到有一个对象处理它为止。每个处理者都有机会处理该请求&#xff0c;或者将其传递给链中的下一个处理者&#xff0c;每个处…

[2025分类时序异常检测指标R-AUC与VUS]

梳理了一下分类中常见的指标&#xff0c;这些指标与时序异常检测中新提出的A-RUC与VUS之间的关系 真正例(True Positive,TP): 被正确识别为正样本的数量。真负例(True Negative,TN): 被正确识别为负样本的数量。假正例(False Positive ,FP): 被错误识为正样本数量假负例(Fals…

Unity中实现伤害跳字效果(简单好抄)

第一步骤安装并导入Dotween插件&#xff08;也可以不用导入之后直接下载我的安装包&#xff09; 官网DOTween - 下载 第二步&#xff1a; 制作跳字预制体 建议把最佳适应打开&#xff0c;这样就不怕数字太大显示不全了。 第三步&#xff1a;创建一个空对象并编写脚本JumpNumbe…

【设计模式-行为型】观察者模式

一、什么是观察者模式 说起观察者模式&#xff0c;不得不说一位观察者模式的高级应用者&#xff0c;朱元璋。不知道大家有没有看过胡军演的电视剧《朱元璋》。这部剧背景是元朝末年&#xff0c;天下大乱&#xff0c;朱元璋自幼父母双亡&#xff0c;沦为乞丐&#xff0c;后遁入空…

考研机试:学分绩点

描述 北京大学对本科生的成绩施行平均学分绩点制&#xff08;GPA&#xff09;。 既将学生的实际考分根据不同的学科的不同学分按一定的公式进行计算。 公式如下&#xff1a; 一门课程的学分绩点 该课绩点 该课学分 总评绩点 所有学科学分绩点之和 / 所有课程学分之和 …

CentOS9 安装Docker+Dpanel+onlyoffice(https、更改字体、字号、去除限制)的避坑笔记

CentOS9 安装Dockeronlyoffice&#xff08;https、更改字体、字号、去除文件大小限制&#xff09;的避坑笔记 一、安装Docker二、更新docker镜像源&#xff1a;三、安装Dpanel四、安装onlyoffice&#xff08;开启https及一些碰到的问题&#xff09;五、更改字体和字号六、去除限…

【玩转全栈】----YOLO8训练自己的模型并应用

继上篇&#xff1a; 【玩转全栈】---基于YOLO8的图片、视频目标检测-CSDN博客 相信大家已经可以训练一些图片和视频了&#xff0c;接下来我将为大家介绍如何训练自己的特定模型&#xff0c;并用其进行检测 目录 准备数据 图片数据 标识数据 配置文件 运行 测试训练结果 存在的问…

OpenCV文字绘制支持中文显示

OpenCV版本&#xff1a;4.4 IDE&#xff1a;VS2019 功能描述 OpenCV绘制文本的函数putText()不支持中文的显示&#xff0c;网上很多方法推荐的都是使用FreeType来支持&#xff0c;FreeType是什么呢&#xff1f;FreeType的官网上有介绍 FreeType官网 https://www.freetype.or…

梯度下降法 (Gradient Descent) 算法详解及案例分析

梯度下降法 (Gradient Descent) 算法详解及案例分析 目录 梯度下降法 (Gradient Descent) 算法详解及案例分析1. 引言2. 梯度下降法 (Gradient Descent) 算法原理2.1 基本概念2.2 算法步骤2.3 梯度下降法的变种3. 梯度下降法的优势与局限性3.1 优势3.2 局限性4. 案例分析4.1 案…

GPSd定时检测保活TCP GPS源

为了在 TCP GPS 源丢失连接时自动重新连接&#xff0c;可以编写一个监控脚本&#xff0c;定期检查 gpspipe 输出中的 TCP 源数据是否存在。如果检测到丢失&#xff0c;则使用 gpsdctl 或直接命令重新添加 TCP 源。 1、工具 检查并安装必要工具&#xff0c;本例需要使用 gpspi…