设计模式:桥接模式(c++实现案例)
桥接模式
桥接模式是一种结构型设计模式, 可将业务逻辑或一个大类拆分为不同的层次结构, 从而能独立地进行开发。桥接模式通过将继承改为组合的方式来解决这个问题。
具体来说, 就是抽取其中一个维度并使之成为独立的类层次, 这样就可以在初始类中引用这个新层次的对象, 从而使得一个类不必拥有所有的状态和行为。
层次结构中的第一层 (通常称为抽象部分) 将包含对第二层 (实现部分) 对象的引用。
抽象部分将能将一些 (有时是绝大部分) 对自己的调用委派给实现部分的对象。 所有的实现部分都有一个通用接口, 因此它们能在抽象部分内部相互替换。
桥接模式在处理跨平台应用、 支持多种类型的数据库服务器或与多个特定种类 (例如云平台和社交网络等) 的 API 供应商协作时会特别有用。
应用实例: 1、猪八戒从天蓬元帅转世投胎到猪,转世投胎的机制将尘世划分为两个等级,即:灵魂和肉体,前者相当于抽象化,后者相当于实现化。生灵通过功能的委派,调用肉体对象的功能,使得生灵可以动态地选择。 2、墙上的开关,可以看到的开关是抽象的,不用管里面具体怎么实现的。
桥接模式实现步骤
1.提供一个抽象类(桥接类):提供高层控制逻辑,依赖实际底层对象
2.提供一个具体抽象类:拓展抽象类,更精确的抽象
3.提供具体实现抽象类:具体实现类的抽象通用接口
4.提供具体实现类:针对不同底层的通用接口实现
代码实现:
#include <iostream> #include <string> #include <vld.h> using namespace std; //1. 作为桥接实现的color类 class color { public: virtual ~color() {} virtual void FillColor() = 0; }; //2.1 实现了color的具体类 class Red :public color { public: Red() :colorType("RED") {} ~Red() {} void FillColor()override { cout << "填充颜色:" << colorType << endl; } private: string colorType; }; //2.2 实现了color的具体类 class Blue :public color { public: Blue() :colorType("BLUE") {} ~Blue() {} void FillColor()override { cout << "填充颜色:" << colorType << endl; } private: string colorType; }; //3. 具体实现抽象类,提供实现接口定义 class Shape { public: virtual ~Shape() { if (m_color) { delete m_color; m_color = nullptr; } } virtual void showShape() = 0; virtual void setColor(color* color) = 0; protected: virtual void drawColor() = 0; virtual void drawShape() = 0; color* m_color; }; //4.1 具体实现类:实现接口 class Circle :public Shape { public: Circle() :shapeType("Circle") {} ~Circle() { } void showShape()override { drawColor(); drawShape(); } void setColor(color* color)override { if (m_color) { delete m_color; m_color = nullptr; } this->m_color = color; } private: void drawColor()override { this->m_color->FillColor(); } void drawShape()override { cout << "绘制:" << shapeType << endl; } string shapeType; }; //4.2 具体实现类:实现接口 class Rect :public Shape { public: Rect() :shapeType("Rect") {} ~Rect() {} void showShape()override { drawColor(); drawShape(); } void setColor(color* color)override { if (m_color) { delete m_color; m_color = nullptr; } this->m_color = color; } private: void drawColor()override { this->m_color->FillColor(); } void drawShape()override { cout << "绘制:" << shapeType << endl; } string shapeType; }; int main() { Shape* circle = new Circle; circle->setColor(new Red); circle->showShape(); circle->setColor(new Blue); circle->showShape(); delete circle; circle = nullptr; Shape* rect = new Rect; rect->setColor(new Red); rect->showShape(); rect->setColor(new Blue); rect->showShape(); delete rect; return 0; }
优点
-
你可以创建与平台无关的类和程序
-
客户端代码仅与高层抽象部分互动, 不接触到平台详细信息
-
开闭原则,可以新增抽象和实现, 且它们之间互不影响
-
单一职责原则,抽象专注高层逻辑, 实现部分处理平台细节
缺点
- 对高内聚的类使用该模式可能会让代码更加复杂
本文来自博客园,作者:hugeYlh,转载请注明原文链接:https://www.cnblogs.com/helloylh/p/17209597.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧