C++设计模式-桥接模式 原创 设计模式 2021年10月20日 15:58 夏至未至 981 当前内容 6650 字,在路上,马上到,马上到 ### 目录 [TOC] ### 桥接模式介绍 #### 何为桥接模式 桥接(Bridge)是用于把`抽象化与实现化解耦`,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。 #### 桥接模式原理 将抽象和实现解耦,让它们可以独立变化。`抽象`和`实现`独立开发,通过对象之间的组合关系,组装在一起。`通过组合关系来替代继承关系`,避免继承层次的指数级爆炸。 #### 为何使用桥接模式 如果一个类或一个系统有多个变化维度时,桥接模式为多维度变化的系统提供了一套完整的解决方案,并且降低了系统的复杂度。 一个类存在两个(或多个)独立变化的维度,我们通过组合的方式,让这两个(或多个)维度可以独立进行扩展。 #### 如何实现桥接模式 把多角度变化分离出来,让它们独立变化,减少它们之间耦合。 ### 桥接模式重点 - 将两个或多个独立变化的维度设计为两个或多个独立的继承等级结构,并且在抽象层建立一个或多个抽象关联。 - 用抽象关联取代了传统的多层继承,将类之间的静态继承关系转换为动态的对象组合关系。 ### 桥接模式应用场景 1. 如果一个系统需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系,通过桥接模式可以使它们在抽象层建立一个关联关系。 2. `抽象部分`和`实现部分`可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。 3. 一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展。 4. 对于那些不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。 ### 模式特点 #### 优点 1. 分离抽象接口与实现部分,使用对象间的关联关系使抽象与实现解耦。 2. 在很多情况下,桥接模式可以取代多层继承方案,多层继承方案违背了“单一职责原则”,复用性较差,且类的个数非常多,能使多继承的M* N个类解决方式,变为M + N个类解决。 3. 桥接模式提高了系统可扩展性,某个维度需要扩展只需增加实现类接口或者具体实现类,而且不影响另一个维度,符合开闭原则。 #### 缺点: 1. 桥接模式的使用会增加系统的理解与设计难度,因为关联关系建立在抽象层,需要一开始就在抽象层进行设计与编程。 2. 桥接模式要求正确识别出系统中两个或多个独立变化的维度,如何准确识别系统中的两个维度是应用桥接模式的难点。 ### 模式角色类 1. Abstraction(抽象类) : 用于定义抽象类的接口,它一般是抽象类,定义了一个Implementor(实现类接口)类型的对象,与其之间具有关联关系,从而分离抽象接口与实现部分 2. RefinedAbstraction(扩充抽象类): 扩充由Abstraction定义的接口,通常情况下它是具体类,实现Abstraction的抽象业务方法,并可以调用在Implementor中定义的业务方法。 3. Implementor(实现类接口): 定义实现类的接口,Implementor接口声明了一些基本操作,而具体实现交给其子类。通过关联关系,在Abstraction中不仅拥有自己的方法,还可以调用到Implementor中定义的方法,使用关联关系来替代继承关系。 4. ConcreteImplementor(具体实现类): 具体实现Implementor接口,在不同的ConcreteImplementor中提供基本操作的不同实现。 ### 上机实操代码 #### 代码场景 绘制不同形状(Circle 、Rectangle)不同颜色(Red、Green、Blue)的图形(Shape) - Abstraction(抽象类) :ShSape - RefinedAbstraction(扩充抽象类):Circle 、Rectangle - Implementor(实现类接口): Color - ConcreteImplementor(具体实现类):Red、Green、Blue #### 代码实现 #include // 场景:绘制不同形状(Circle 、Rectangle)不同颜色(Red、Green、Blue)的图形(Shape) // 颜色类接口,颜色抽象类 class Color { public: virtual ~Color() = default; // 绘制颜色 virtual void fillColor() = 0; }; // 实现具体颜色接口类:Red、Green、Blue class Red : public Color { public: Red() { std::cout << "红色被创建" << std::endl; colorType = "红色"; } ~Red() override { std::cout << "红色被销毁" << std::endl; } void fillColor() override { std::cout << "绘制颜色: " << colorType << std::endl; } private: std::string colorType; }; class Green : public Color { public: Green() { std::cout << "绿色被创建" << std::endl; colorType = "绿色"; } ~Green() override { std::cout << "绿色被销毁" << std::endl; } void fillColor() override { std::cout << "绘制颜色: " << colorType << std::endl; } private: std::string colorType; }; class Blue : public Color { public: Blue() { std::cout << "蓝色被创建" << std::endl; colorType = "蓝色"; } ~Blue() override { std::cout << "蓝色被销毁" << std::endl; } void fillColor() override { std::cout << "绘制颜色: " << colorType << std::endl; } private: std::string colorType; }; // 形状接口类,形状抽象类 class Shape { public: virtual ~Shape() = default; // 展示形状 virtual void showShape() = 0; // 选择颜色 virtual void chooseColor(Color* col) = 0; protected: // 绘制形状 virtual void drawShape() = 0; // 绘制颜色 virtual void drawColor() = 0; // 组合体现 Color* color = nullptr; }; // 具体形状实现:Circle 、Rectangle class Circle : public Shape { public: Circle() { std::cout << "圆形被创建" << std::endl; shapeType = "圆形"; } ~Circle() override { std::cout << "圆形被销毁" << std::endl; delete color; } void showShape() override { drawShape(); drawColor(); } void chooseColor(Color* col) override { color = col; } private: void drawShape() override { std::cout << "绘制图形: " << shapeType << std::endl; } void drawColor() override { color->fillColor(); } std::string shapeType; }; class Rectangle : public Shape { public: Rectangle() { std::cout << "长方形被创建" << std::endl; shapeType = "长方形"; } ~Rectangle() override { std::cout << "长方形被销毁" << std::endl; delete color; } void showShape() override { drawShape(); drawColor(); } void chooseColor(Color* col) override { color = col; } private: void drawShape() override { std::cout << "绘制图形: " << shapeType << std::endl; } void drawColor() override { color->fillColor(); } std::string shapeType; }; // 测试 int main() { std::cout << "网站:https://www.codecomeon.com/" << std::endl; std::cout << std::endl; Shape* shape; std::cout << "=====绘制 红色 圆形=====" << std::endl; shape = new Circle(); shape->chooseColor(new Red()); shape->showShape(); delete shape; std::cout << std::endl; std::cout << "=====绘制 绿色 圆形=====" << std::endl; shape = new Circle(); shape->chooseColor(new Green()); shape->showShape(); delete shape; std::cout << std::endl; std::cout << "=====绘制 蓝色 长方形=====" << std::endl; shape = new Rectangle(); shape->chooseColor(new Blue()); shape->showShape(); delete shape; std::cout << std::endl; return 0; } #### 执行输出 网站:https://www.codecomeon.com/ =====绘制 红色 圆形===== 圆形被创建 红色被创建 绘制图形: 圆形 绘制颜色: 红色 圆形被销毁 红色被销毁 =====绘制 绿色 圆形===== 圆形被创建 绿色被创建 绘制图形: 圆形 绘制颜色: 绿色 圆形被销毁 绿色被销毁 =====绘制 蓝色 长方形===== 长方形被创建 蓝色被创建 绘制图形: 长方形 绘制颜色: 蓝色 长方形被销毁 蓝色被销毁 E:\DesignPatterns\DesignPatterns\Debug\DesignPatterns.exe (进程 8572)已退出,代码为 0。 按任意键关闭此窗口. . . 本文标题: C++设计模式-桥接模式 本文作者: 夏至未至 发布时间: 2021年10月20日 15:58 最近更新: 2022年2月21日 11:42 原文链接: 许可协议: 署名-非商业性-禁止演绎 4.0 国际(CC BY-NC-ND 4.0) 请按协议转载并保留原文链接及作者 设计模式(25) 上一个 C++设计模式-组合模式 下一个 C++设计模式-适配器模式 当前文章评论暂未开放,请移步至留言处留言。