当前位置: 首页 > news >正文

23种设计模式之【桥接模式】-核心原理与 Java实践

文章目录

  • 桥接模式(Bridge Pattern)
  • 核心原理
  • Java 实践示例
  • 桥接模式的特点
  • 桥接模式的应用场景

桥接模式(Bridge Pattern)

桥接模式是 23 种设计模式中的一种结构型模式,其核心思想是将抽象部分与实现部分分离,使它们可以独立变化。这种模式通过引入 “桥接”(抽象与实现之间的关联),解决了因多维度变化导致的类爆炸问题,提高了系统的灵活性和可扩展性。

核心原理

  • 抽象化角色(Abstraction):
    定义抽象类的接口,持有一个对实现化角色的引用
    负责定义抽象部分的业务方法,不涉及具体实现
  • 扩展抽象化角色(RefinedAbstraction):
    继承抽象化角色,扩展抽象部分的功能
    实现父类中的抽象方法,并可能添加新的方法
  • 实现化角色(Implementor):
    定义实现部分的接口,提供基本操作
    不直接与抽象化角色中的业务方法对应,而是提供底层实现
  • 具体实现化角色(ConcreteImplementor):
    实现实现化角色的接口,提供具体的业务实现
    可以有多个不同的具体实现类

桥接模式的核心是 “分离抽象与实现”,通过抽象类引用实现接口,使抽象和实现可以沿着各自的维度独立扩展,避免了多维度组合导致的类数量爆炸。

Java 实践示例

以 “电子设备与遥控器” 为例实现桥接模式:
抽象维度:基础遥控器、高级遥控器(支持更多功能)
实现维度:电视、收音机等不同电子设备
通过桥接将遥控器(抽象)与设备(实现)分离,使两者可独立扩展

package com.example.demo;public class BridgePattern {public static void main(String[] args) {// 创建具体设备Device tv = new TV();Device radio = new Radio();// 基础遥控器控制电视RemoteControl basicRemoteForTV = new BasicRemoteControl(tv);System.out.println("=== 基础遥控器控制电视 ===");basicRemoteForTV.powerOn();basicRemoteForTV.setChannel(5);basicRemoteForTV.powerOff();// 高级遥控器控制收音机RemoteControl advancedRemoteForRadio = new AdvancedRemoteControl(radio);System.out.println("\n=== 高级遥控器控制收音机 ===");advancedRemoteForRadio.powerOn();advancedRemoteForRadio.setChannel(88.5);((AdvancedRemoteControl) advancedRemoteForRadio).setVolume(20);advancedRemoteForRadio.powerOff();//=== 基础遥控器控制电视 ===//电视已打开//电视频道已设置为:5//电视已关闭////=== 高级遥控器控制收音机 ===//收音机已打开//收音机音量已设置为:15//收音机频率已设置为:88.5MHz//收音机音量已设置为:20//收音机已关闭}// 实现化角色:设备接口(定义设备的基本操作)public interface Device {void powerOn();void powerOff();void setChannel(double channel);void setVolume(int volume);}// 具体实现:电视public static class TV implements Device {private boolean isOn = false;private int channel = 1;private int volume = 10;@Overridepublic void powerOn() {isOn = true;System.out.println("电视已打开");}@Overridepublic void powerOff() {isOn = false;System.out.println("电视已关闭");}@Overridepublic void setChannel(double channel) {if (isOn) {this.channel = (int) channel;System.out.println("电视频道已设置为:" + this.channel);} else {System.out.println("请先打开电视");}}@Overridepublic void setVolume(int volume) {if (isOn) {this.volume = volume;System.out.println("电视音量已设置为:" + this.volume);}}}// 具体实现:收音机public static class Radio implements Device {private boolean isOn = false;private double frequency = 87.5;private int volume = 5;@Overridepublic void powerOn() {isOn = true;System.out.println("收音机已打开");}@Overridepublic void powerOff() {isOn = false;System.out.println("收音机已关闭");}@Overridepublic void setChannel(double frequency) {if (isOn) {this.frequency = frequency;System.out.println("收音机频率已设置为:" + this.frequency + "MHz");} else {System.out.println("请先打开收音机");}}@Overridepublic void setVolume(int volume) {if (isOn) {this.volume = volume;System.out.println("收音机音量已设置为:" + this.volume);}}}// 抽象化角色:遥控器抽象类public abstract static class RemoteControl {// 持有设备接口的引用(桥接点)protected Device device;// 通过构造函数注入设备public RemoteControl(Device device) {this.device = device;}// 抽象方法:开机public abstract void powerOn();// 抽象方法:关机public abstract void powerOff();// 抽象方法:设置频道public abstract void setChannel(double channel);}// 扩展抽象:基础遥控器public static class BasicRemoteControl extends RemoteControl {public BasicRemoteControl(Device device) {super(device);}@Overridepublic void powerOn() {device.powerOn();}@Overridepublic void powerOff() {device.powerOff();}@Overridepublic void setChannel(double channel) {device.setChannel(channel);}}// 扩展抽象:高级遥控器(新增音量调节功能)public static class AdvancedRemoteControl extends RemoteControl {public AdvancedRemoteControl(Device device) {super(device);}@Overridepublic void powerOn() {device.powerOn();// 高级功能:开机自动调节到适中音量device.setVolume(15);}@Overridepublic void powerOff() {device.powerOff();}@Overridepublic void setChannel(double channel) {device.setChannel(channel);}// 新增功能:调节音量public void setVolume(int volume) {device.setVolume(volume);}}
}

桥接模式的特点

优点:
分离抽象与实现:抽象部分和实现部分可独立扩展,互不影响
减少类数量:避免多维度组合导致的类爆炸(如 2 种遥控器 ×2 种设备 = 4 个类,而非传统继承的 2+2+2=6 个类)
提高灵活性:可动态切换实现,抽象部分可透明地使用不同实现
符合开闭原则:新增抽象或实现时无需修改原有代码
缺点:
增加系统复杂度:引入额外的抽象层和桥接点,理解难度提高
要求正确识别系统的两个独立变化维度,设计难度较大
与适配器模式的区别:
桥接模式:在设计初期就考虑分离抽象与实现,为了扩展
适配器模式:在系统设计完成后解决接口不兼容问题,为了兼容

桥接模式的应用场景

多维度变化的系统:
当系统存在两个或多个独立变化的维度(如形状 × 颜色、操作系统 × 软件)
例如:图形系统中,形状(圆形、矩形)和渲染方式(软件渲染、硬件渲染)是两个独立维度
避免继承爆炸:
当使用继承会导致大量子类(如 4 种品牌 ×3 种类型 = 12 个子类)
例如:电器产品(冰箱、洗衣机)与品牌(海尔、美的)的组合
框架设计:
框架需要为抽象部分和实现部分提供扩展点
例如:Java 的 AWT 中,Component(抽象)与Peer(实现)的分离,支持不同平台的 UI 实现
数据库驱动:
数据库操作接口(抽象)与不同数据库驱动(实现)的分离
例如:JDBC 中Driver接口与不同数据库的驱动实现

桥接模式是应对 “多维度变化” 场景的最佳方案,通过分离抽象与实现,使系统可以沿着多个维度独立扩展,同时避免了类数量的急剧增加。在设计初期识别出系统的独立变化维度,是成功应用桥接模式的关键。

http://www.dtcms.com/a/394146.html

相关文章:

  • LabVIEW手部运动机能实验
  • 669. 修剪二叉搜索树
  • 大QMT自动可转债申购
  • PolarCTF PWN 网络安全2023秋季个人挑战赛刷题
  • MySQL-day4_02(事务)
  • JUC(8)线程安全集合类
  • springboot中@EnableAsync有什么作用
  • Spark专题-第二部分:Spark SQL 入门(6)-算子介绍-Generate
  • C#练习题——Dictionary
  • Feign
  • SPA小说集之三《森林城市反甩锅战:ERP的权责边界》
  • Qt(模态对话框和非模态对话框)
  • 【无标题】物联网 frid卡控制
  • 【LLM LangChain】 模型绑定工具+调用工具(手动调用/LangGraph/AgentExecutor)+相关注意事项
  • 图神经网络(GNN)入门:用PyG库处理分子结构与社会网络
  • 【C++】编码表 STL简介:STL是什么,版本,六大组件,重要性以及学习方法总结
  • show_interrupts函数的进一步解析及irq_desc结构体
  • Kafka面试精讲 Day 19:JVM调优与内存管理
  • 10.vector容器
  • Linux系统介绍
  • MFC中的CMFCDynamicLayout类的介绍
  • UniScene 统一驾驶场景 | 生成语义占据 | 生成多视角视频 | 生成激光点云 CVPR2025
  • Git 简明教程:从原理到实战
  • 【设计模式】中介者模式
  • nginx添加modsecurity插件
  • 代码上传Github:SSH法
  • 【iOS】AFNetworking初步了解及使用
  • JVM实战-G1参数调优
  • 超简单的视频分割脚本
  • 基于51单片机电子钟闹钟12/24小时制LCD显示( proteus仿真+程序+设计报告+讲解视频)