学校网站管理安徽网站优化多少钱

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

学校网站管理,安徽网站优化多少钱,wordpress 多域名绑定,东莞seo建站优化哪里好什么是桥接模式#xff1f; 桥接模式#xff08;Bridge Pattern#xff09;是一个用来解耦的设计模式#xff0c;它将抽象层和实现层分离开#xff0c;让它们可以独立变化。用最简单的话来说#xff0c;就是让你能够改变抽象的功能和具体的实现#xff0c;而不需要修改…什么是桥接模式 桥接模式Bridge Pattern是一个用来解耦的设计模式它将抽象层和实现层分离开让它们可以独立变化。用最简单的话来说就是让你能够改变抽象的功能和具体的实现而不需要修改对方的代码。 举个例子想象你在做一个图形绘制的程序你有很多图形比如圆形、方形而且每种图形可能有不同的绘制方式比如屏幕绘制、打印机绘制。如果你把所有的图形和绘制方式都写在一起每次你增加一种新的绘制方式或新图形时你都要修改大量的代码这样就会让系统变得很复杂。 桥接模式的思路是把图形抽象和绘制方式实现分开每一部分都可以独立变化互不干扰。这样一来增加新的图形或者新的绘制方式时就不需要修改现有的代码只需要扩展新的类即可。 桥接模式的结构 桥接模式有两个重要部分 抽象部分比如图形的类型如圆形、方形等实现部分比如具体的绘制方式如屏幕绘制、打印绘制等 这两个部分通过“桥”连接起来形成了一个灵活可扩展的结构。下面的代码结构就能帮助你理解这一点。 桥接模式的代码示例 假设我们要实现一个图形绘制的程序支持不同的图形圆形、方形和不同的绘制方式屏幕绘制、打印机绘制。我们来看看怎么用桥接模式来实现。 #include iostream #include string// 绘图接口实现类接口 class DrawingAPI { public:virtual void drawCircle(double x, double y, double radius) 0;virtual ~DrawingAPI() default; };// 具体实现屏幕绘制 class ScreenDrawingAPI : public DrawingAPI { public:void drawCircle(double x, double y, double radius) override {std::cout 在屏幕上绘制圆形位置: ( x , y ), 半径: radius std::endl;} };// 具体实现打印机绘制 class PrinterDrawingAPI : public DrawingAPI { public:void drawCircle(double x, double y, double radius) override {std::cout 在打印机上绘制圆形位置: ( x , y ), 半径: radius std::endl;} };// 图形类抽象类 class Shape { protected:DrawingAPI* drawingAPI; // 这里持有一个指向绘图实现类的指针public:Shape(DrawingAPI* api) : drawingAPI(api) {} // 通过构造函数注入具体实现类virtual void draw() 0; // 绘制图形的接口virtual void resize(double factor) 0; // 调整图形大小virtual ~Shape() default; };// 扩展的具体图形类圆形 class Circle : public Shape { private:double x, y, radius; // 圆形的坐标和半径public:Circle(double x, double y, double radius, DrawingAPI* api) : Shape(api), x(x), y(y), radius(radius) {}void draw() override {drawingAPI-drawCircle(x, y, radius); // 将绘制任务委托给具体实现}void resize(double factor) override {radius * factor; // 调整圆形的半径} };int main() {ScreenDrawingAPI screenAPI; // 创建屏幕绘制实现PrinterDrawingAPI printerAPI; // 创建打印机绘制实现// 创建圆形对象使用不同的绘制方式Circle circle1(1, 2, 3, screenAPI); // 在屏幕上绘制Circle circle2(5, 6, 4, printerAPI); // 在打印机上绘制circle1.draw(); // 屏幕绘制圆形circle2.draw(); // 打印机绘制圆形circle1.resize(2.0); // 改变圆形大小circle1.draw(); // 再次绘制使用屏幕绘制return 0; }代码讲解 让我们一步步来解读这段代码看看桥接模式是如何工作的。

  1. 绘图接口DrawingAPI class DrawingAPI { public:virtual void drawCircle(double x, double y, double radius) 0;virtual ~DrawingAPI() default; };这个类定义了一个绘制圆形的方法 drawCircle它只是一个接口并不做具体的绘制工作。任何具体的绘制方式比如屏幕绘制、打印机绘制都需要实现这个接口。
  2. 具体的绘图实现ScreenDrawingAPI 和 PrinterDrawingAPI class ScreenDrawingAPI : public DrawingAPI { public:void drawCircle(double x, double y, double radius) override {std::cout 在屏幕上绘制圆形位置: ( x , y ), 半径: radius std::endl;} };class PrinterDrawingAPI : public DrawingAPI { public:void drawCircle(double x, double y, double radius) override {std::cout 在打印机上绘制圆形位置: ( x , y ), 半径: radius std::endl;} };这两个类分别实现了 DrawingAPI 接口提供了不同的绘制方式。ScreenDrawingAPI 在屏幕上绘制圆形PrinterDrawingAPI 在打印机上绘制圆形。
  3. 抽象类Shape class Shape { protected:DrawingAPI* drawingAPI; // 持有一个绘图实现类的指针public:Shape(DrawingAPI* api) : drawingAPI(api) {} // 通过构造函数注入具体的绘图实现virtual void draw() 0; // 绘制图形的接口virtual void resize(double factor) 0; // 调整图形大小 };Shape 是一个抽象类它定义了所有图形的共同接口draw() 和 resize()。关键是它持有一个 DrawingAPI 的指针这样它可以将具体的绘制任务委托给实现类。
  4. 具体图形类Circle class Circle : public Shape { private:double x, y, radius; // 圆形的坐标和半径public:Circle(double x, double y, double radius, DrawingAPI* api) : Shape(api), x(x), y(y), radius(radius) {}void draw() override {drawingAPI-drawCircle(x, y, radius); // 调用具体绘图实现的drawCircle方法}void resize(double factor) override {radius * factor; // 改变圆形的半径} };Circle 类继承自 Shape并实现了 draw() 和 resize() 方法。它通过 drawingAPI 指针来调用具体的绘制方法实现了与绘制方式的解耦。
  5. 客户端代码 在 main 函数中我们创建了两个 Circle 对象分别使用了 ScreenDrawingAPI 和 PrinterDrawingAPI 作为绘制实现。通过调用 circle1.draw() 和 circle2.draw()我们可以看到两个不同的绘制方式。 int main() {ScreenDrawingAPI screenAPI; // 屏幕绘制实现PrinterDrawingAPI printerAPI; // 打印机绘制实现// 创建两个圆形对象分别使用不同的绘制方式Circle circle1(1, 2, 3, screenAPI);Circle circle2(5, 6, 4, printerAPI);circle1.draw(); // 屏幕绘制圆形circle2.draw(); // 打印机绘制圆形circle1.resize(2.0); // 改变圆形大小circle1.draw(); // 再次绘制使用屏幕绘制return 0; }总结 桥接模式的主要优点就是解耦 。我们把抽象部分如图形类型和实现部分如绘制方式分开避免了两者之间的紧耦合。这样我们可以很方便地扩展新的图形类型或新的绘制方式而不需要修改现有的代码。 比如如果你以后需要支持新的绘制方式比如在Web上绘制你只需要实现一个新的 DrawingAPI 类不用改动任何图形类同样如果你需要增加新的图形类型比如矩形只需要扩展 Shape 类不需要改动任何绘制实现。 桥接模式适用于需要将抽象和实现分离并且它们可能会独立变化的场景。 本文由mdnice多平台发布