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

桥接模式_结构型_GOF23


桥接模式

桥接模式(Bridge Pattern)是一种结构型设计模式,核心思想是将抽象与实现分离,使两者能独立变化。它像一座连接两岸的桥梁,让“抽象层”和“实现层”自由组合,避免因多维度变化导致的“类爆炸”问题。例如,手机型号(抽象层)和功能模块(实现层)可以独立升级,无需为每种组合创建新类。


一、通俗理解

想象你设计一款智能遥控器:

  1. 传统方式:为每个电器(电视、空调)开发专用遥控器,导致代码冗余。
  2. 桥接模式
    • 抽象层:遥控器的通用操作(开关、调音量)。
    • 实现层:不同电器的具体功能(电视换台、空调调温)。
      通过桥接,一个遥控器可控制所有电器,新增电器只需扩展实现层,无需修改抽象层。

二、模式结构

桥接模式包含四个角色:

  1. 抽象化(Abstraction):定义高层接口(如遥控器基类)。
  2. 扩展抽象化(Refined Abstraction):扩展功能(如带定时功能的遥控器)。
  3. 实现化(Implementor):定义底层接口(如电器开关标准)。
  4. 具体实现化(Concrete Implementor):实现具体功能(如电视、空调)。

三、适用场景
  1. 多维度变化:如形状(圆形/矩形)×颜色(红/蓝)、支付渠道(微信/支付宝)×支付方式(扫码/密码)。
  2. 动态组合需求:运行时灵活切换抽象与实现(如跨平台应用适配不同系统)。
  3. 避免继承爆炸:替代多层类继承,提升代码可维护性。

四、代码实现
1. C++ 示例(遥控器与电器桥接)
#include <iostream>  

// 实现层:电器接口  
class Device {  
public:  
    virtual void turnOn() = 0;  
    virtual void setMode(int mode) = 0;  
};  

// 具体实现:电视  
class TV : public Device {  
public:  
    void turnOn() override { std::cout << "电视启动\n"; }  
    void setMode(int mode) override {  
        std::cout << "切换到频道:" << mode << std::endl;  
    }  
};  

// 抽象层:遥控器基类  
class RemoteControl {  
protected:  
    Device* device;  
public:  
    RemoteControl(Device* dev) : device(dev) {}  
    virtual void powerOn() { device->turnOn(); }  
    virtual void setMode(int mode) = 0;  
};  

// 扩展抽象:带数字按键的遥控器  
class AdvancedRemote : public RemoteControl {  
public:  
    AdvancedRemote(Device* dev) : RemoteControl(dev) {}  
    void setMode(int mode) override {  
        device->setMode(mode);  
    }  
};  

// 客户端  
int main() {  
    Device* tv = new TV();  
    RemoteControl* remote = new AdvancedRemote(tv);  
    remote->powerOn();        // 输出:电视启动  
    remote->setMode(5);       // 输出:切换到频道:5  
    delete tv;  
    delete remote;  
    return 0;  
}  
2. Python 示例(图形绘制:形状×颜色)
from abc import ABC, abstractmethod  

# 实现层:颜色接口  
class Color(ABC):  
    @abstractmethod  
    def apply_color(self):  
        pass  

class Red(Color):  
    def apply_color(self):  
        return "红色"  

# 抽象层:形状基类  
class Shape(ABC):  
    def __init__(self, color):  
        self.color = color  

    @abstractmethod  
    def draw(self):  
        pass  

class Circle(Shape):  
    def draw(self):  
        print(f"绘制{self.color.apply_color()}的圆形")  

# 客户端  
if __name__ == "__main__":  
    red_circle = Circle(Red())  
    red_circle.draw()  # 输出:绘制红色的圆形  
3. Java 示例(支付系统:渠道×方式)
// 实现层:支付方式接口  
interface PayMode {  
    boolean securityCheck(String uid);  
}  

class FacePay implements PayMode {  
    public boolean securityCheck(String uid) {  
        System.out.println("人脸识别验证通过");  
        return true;  
    }  
}  

// 抽象层:支付渠道基类  
abstract class Payment {  
    protected PayMode payMode;  
    public Payment(PayMode mode) { this.payMode = mode; }  
    public abstract void pay(String uid, double amount);  
}  

class WeChatPay extends Payment {  
    public WeChatPay(PayMode mode) { super(mode); }  
    public void pay(String uid, double amount) {  
        if (payMode.securityCheck(uid)) {  
            System.out.println("微信支付成功:" + amount);  
        }  
    }  
}  

// 客户端  
public class Client {  
    public static void main(String[] args) {  
        Payment payment = new WeChatPay(new FacePay());  
        payment.pay("user123", 100.0);  // 输出:人脸识别 → 微信支付成功  
    }  
}  

五、优缺点分析
优点缺点
1. 解耦抽象与实现,扩展性强1. 设计复杂度高(需提前识别变化维度)
2. 动态组合对象,灵活性高2. 需维护更多类(抽象/实现分离)
3. 避免类爆炸,符合开闭原则3. 对简单场景可能过度设计

六、总结

桥接模式通过组合代替继承,解决了多维度变化的系统设计难题。其核心价值在于:

  1. 解耦思维:抽象层关注业务逻辑,实现层专注底层细节。
  2. 动态扩展:新增维度只需扩展对应层级,无需修改现有代码(如新增支付方式或电器类型)。
  3. 实际应用:广泛用于GUI框架、跨平台开发、支付系统等需要灵活组合的场景。

扩展思考

  • 与适配器模式区别:适配器解决接口兼容问题,桥接模式解决多维解耦问题。
  • 与策略模式对比:策略模式针对算法替换,桥接模式针对多维结构分离。
http://www.dtcms.com/a/99861.html

相关文章:

  • day17 学习笔记
  • Gateway实战入门(四)、断言-请求头以及请求权重分流等
  • Kafka 多线程开发消费者实例
  • 第四天 文件操作(文本/CSV/JSON) - 异常处理机制 - 练习:日志文件分析器
  • 【Python】基于 qwen_agent 构建 AI 绘画智能助手
  • Linux 文件存储和删除原理
  • Unity编辑器功能及拓展(2) —Gizmos编辑器绘制功能
  • Kafka消息丢失全解析!原因、预防与解决方案
  • 如何查看 SQL Server 的兼容性级别
  • 基于ruoyi快速开发平台搭建----超市仓库管理(修改记录1)
  • 《C++11:通过thread类编写C++多线程程序》
  • 编辑器场景视窗扩展
  • SpringBean模块(一)定义如何创建生命周期
  • 《C++Linux编程进阶:从0实现muduo 》-第6讲.C++死锁问题如何分析调试-原子操作,互斥量,条件变量的封装
  • 稻壳模板下载器(Windows):免费获取WPS稻壳模板的利器
  • Java中优先级队列的实现
  • 蓝桥杯备考------>双指针(滑动窗口)
  • 华为OD机试2025A卷 - 最大值(Java Python JS C++ C )
  • PyTorch 2.6.0没有对应的torch-sparse版本,不要下载pytorch最新版本,否则用不了图神经网络torch_geometric
  • vmware_unbantu刷新IP
  • EtherNet/IP转ProfiNet协议转换网关驱动西门子PLC与流量计的毫秒级压力同步控制
  • 洛谷题单1-P5706 【深基2.例8】再分肥宅水-python-流程图重构
  • MySQL单表查询、多表查询
  • linux实现rsync+sersync实时数据备份
  • Redis-快速入门
  • GPT Actions
  • 【硬件测试】基于FPGA的16QAM+帧同步系统开发与硬件片内测试,包含高斯信道,误码统计,可设置SNR
  • 【Find My全球市场观察:中国制造如何改写游戏规则?】
  • 游戏引擎学习第191天
  • 【Python】工作笔记:返回当月第一天、昨天;上月第一天、当天;全年节假日