一、什么是桥接模式桥接模式是一种结构型设计模式它将抽象部分与实现部分分离使它们可以独立变化。通过组合的方式代替继承避免了类爆炸的问题。核心思想将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构通过桥接连接它们。二、为什么要用桥接模式常见问题场景假设你要开发一个图形绘制系统需要支持不同形状圆形、方形和不同颜色红色、蓝色。使用继承的方式形状基类红色圆形蓝色圆形绿色圆形红色方形蓝色方形绿色方形… (3种颜色 × 3种形状 9个类)如果有 M 种形状和 N 种颜色需要创建 M×N 个类这就是类爆炸。使用桥接模式形状独立变化颜色独立变化通过桥接组合只需 M N 个类三、桥接模式的结构持有引用继承实现实现Abstraction- imp: Implementor operation()RefinedAbstraction operation()«interface»Implementor operationImpl()ConcreteImplA operationImpl()ConcreteImplB operationImpl()角色说明角色英文名定义在本示例中的体现抽象类Abstraction定义抽象接口维护一个指向实现部分的引用Shape(形状抽象类)扩展抽象类RefinedAbstraction扩展或修改抽象类的接口定义Circle、Rectangle、Triangle(具体形状类)实现接口Implementor定义实现部分的接口通常只提供基本操作Color(颜色接口类)具体实现类ConcreteImplA / ConcreteImplB实现Implementor接口的具体类Red、Blue、Green(具体颜色类)四、应用场景1.跨平台UI框架抽象窗口、按钮、文本框实现Windows、macOS、Linux的绘制API2.数据库驱动抽象数据库操作增删改查实现MySQL、PostgreSQL、Oracle的具体实现3.消息发送系统抽象消息类型普通、加急、定时实现发送方式邮件、短信、微信4.图形系统抽象形状圆形、矩形、三角形实现渲染引擎OpenGL、DirectX、Vulkan5.设备控制系统抽象遥控器开关、调音量实现设备电视、音响、投影仪五、C代码示例示例1图形绘制系统#includeiostream#includememory#includestring// 前向声明classColor;// 实现部分颜色接口 classColor{public:virtual~Color()default;virtualvoidapplyColor()const0;};// 具体实现红色classRed:publicColor{public:voidapplyColor()constoverride{std::cout应用红色std::endl;}};// 具体实现蓝色classBlue:publicColor{public:voidapplyColor()constoverride{std::cout应用蓝色std::endl;}};// 具体实现绿色classGreen:publicColor{public:voidapplyColor()constoverride{std::cout应用绿色std::endl;}};// 抽象部分形状 classShape{protected:std::shared_ptrColorcolor_;// 桥接持有颜色对象的引用public:Shape(std::shared_ptrColorcolor):color_(color){}virtual~Shape()default;virtualvoiddraw()const0;};// 扩展抽象圆形classCircle:publicShape{private:doubleradius_;public:Circle(std::shared_ptrColorcolor,doubleradius):Shape(color),radius_(radius){}voiddraw()constoverride{std::cout绘制半径为 radius_ 的圆形;color_-applyColor();}};// 扩展抽象矩形classRectangle:publicShape{private:doublewidth_,height_;public:Rectangle(std::shared_ptrColorcolor,doublewidth,doubleheight):Shape(color),width_(width),height_(height){}voiddraw()constoverride{std::cout绘制尺寸为 width_xheight_ 的矩形;color_-applyColor();}};// 扩展抽象三角形classTriangle:publicShape{private:doublesideLength_;public:Triangle(std::shared_ptrColorcolor,doublesideLength):Shape(color),sideLength_(sideLength){}voiddraw()constoverride{std::cout绘制边长为 sideLength_ 的三角形;color_-applyColor();}};// 使用示例intmain(){// 创建颜色对象autoredstd::make_sharedRed();autobluestd::make_sharedBlue();autogreenstd::make_sharedGreen();// 创建各种形状组合不同颜色std::vectorstd::shared_ptrShapeshapes;shapes.push_back(std::make_sharedCircle(red,5.0));shapes.push_back(std::make_sharedRectangle(blue,10.0,20.0));shapes.push_back(std::make_sharedTriangle(green,8.0));shapes.push_back(std::make_sharedCircle(green,3.0));// 绘制所有形状for(constautoshape:shapes){shape-draw();}return0;}示例2消息发送系统#includeiostream#includememory#includestring#includechrono#includethread// 实现部分消息发送方式 classMessageSender{public:virtual~MessageSender()default;virtualvoidsend(conststd::stringmessage)const0;};// 邮件发送classEmailSender:publicMessageSender{private:std::string email_;public:EmailSender(conststd::stringemail):email_(email){}voidsend(conststd::stringmessage)constoverride{std::cout发送邮件到 email_: messagestd::endl;}};// 短信发送classSMSSender:publicMessageSender{private:std::string phoneNumber_;public:SMSSender(conststd::stringphone):phoneNumber_(phone){}voidsend(conststd::stringmessage)constoverride{std::cout发送短信到 phoneNumber_: messagestd::endl;}};// 微信发送classWeChatSender:publicMessageSender{private:std::string wechatId_;public:WeChatSender(conststd::stringid):wechatId_(id){}voidsend(conststd::stringmessage)constoverride{std::cout发送微信到 wechatId_: messagestd::endl;}};// 抽象部分消息 classMessage{protected:std::shared_ptrMessageSendersender_;public:Message(std::shared_ptrMessageSendersender):sender_(sender){}virtual~Message()default;virtualvoiddeliver(conststd::stringcontent)const0;};// 普通消息classNormalMessage:publicMessage{public:NormalMessage(std::shared_ptrMessageSendersender):Message(sender){}voiddeliver(conststd::stringcontent)constoverride{std::cout[普通消息] ;sender_-send(content);}};// 加急消息classUrgentMessage:publicMessage{public:UrgentMessage(std::shared_ptrMessageSendersender):Message(sender){}voiddeliver(conststd::stringcontent)constoverride{std::cout[加急消息] ;sender_-send([URGENT] content);}};// 定时消息classScheduledMessage:publicMessage{private:intdelaySeconds_;public:ScheduledMessage(std::shared_ptrMessageSendersender,intdelay):Message(sender),delaySeconds_(delay){}voiddeliver(conststd::stringcontent)constoverride{std::cout[定时消息] 将在 delaySeconds_ 秒后发送std::endl;std::this_thread::sleep_for(std::chrono::seconds(delaySeconds_));sender_-send(content);}};// 使用示例intmain(){// 创建发送方式autoemailSenderstd::make_sharedEmailSender(userexample.com);autosmsSenderstd::make_sharedSMSSender(13800138000);autowechatSenderstd::make_sharedWeChatSender(wxid_123456);// 创建各种消息组合不同发送方式autonormalEmailNormalMessage(emailSender);autourgentSMSUrgentMessage(smsSender);autoscheduledWeChatScheduledMessage(wechatSender,2);// 发送消息normalEmail.deliver(会议提醒);urgentSMS.deliver(服务器宕机);scheduledWeChat.deliver(明天记得开会);return0;}六、桥接模式 vs 其他模式模式区别适配器模式适配器用于让不兼容的接口协同工作事后调整桥接用于设计时就分离抽象和实现事前设计策略模式策略模式关注算法的切换桥接模式关注抽象和实现的分离更强调两个维度的独立变化模板方法模式模板方法使用继承桥接使用组合更灵活七、优缺点优点✅单一职责原则抽象和实现分离各自独立变化✅开闭原则可以独立扩展抽象和实现层次不影响对方✅消除类爆炸避免M×N的类组合爆炸✅提高可扩展性增加新的实现或抽象都很方便✅实现细节隐藏客户端不需要关心具体实现细节缺点❌增加复杂度需要理解抽象-实现分离的概念❌可能过度设计对于简单的继承体系不适用❌需要准确识别变化维度需要正确识别系统中独立变化的两个维度八、使用建议何时使用桥接模式✅ 想要避免抽象和实现之间的永久绑定✅ 抽象和实现都应该是可扩展的✅ 对客户隐藏实现细节✅ 有多个独立的维度需要变化✅ 需要在运行时切换实现何时避免使用❌ 只有一个实现维度时没必要使用❌ 抽象和实现的关系不会变化❌ 系统已经很简单使用桥接反而增加复杂度总结桥接模式通过将继承关系转化为组合关系成功解决了多维度变化导致的类爆炸问题。它让抽象和实现可以独立发展是应对复杂系统扩展的优秀设计模式。在实际开发中当你发现类爆炸的苗头或者需要支持多个独立变化的维度时就可以考虑使用桥接模式。