襄陽營銷型網(wǎng)站寶雞seo培訓
什么是橋接模式?
橋接模式(Bridge Pattern)是一個用來解耦的設計模式,它將抽象層和實現(xiàn)層分離開,讓它們可以獨立變化。用最簡單的話來說,就是讓你能夠改變抽象的功能和具體的實現(xiàn),而不需要修改對方的代碼。
舉個例子,想象你在做一個圖形繪制的程序,你有很多圖形(比如圓形、方形),而且每種圖形可能有不同的繪制方式(比如屏幕繪制、打印機繪制)。如果你把所有的圖形和繪制方式都寫在一起,每次你增加一種新的繪制方式或新圖形時,你都要修改大量的代碼,這樣就會讓系統(tǒng)變得很復雜。
橋接模式的思路是:把**圖形(抽象)和繪制方式(實現(xiàn))**分開,每一部分都可以獨立變化,互不干擾。這樣一來,增加新的圖形或者新的繪制方式時,就不需要修改現(xiàn)有的代碼,只需要擴展新的類即可。
橋接模式的結(jié)構(gòu)
橋接模式有兩個重要部分:
- 抽象部分(比如圖形的類型,如圓形、方形等)
- 實現(xiàn)部分(比如具體的繪制方式,如屏幕繪制、打印繪制等)
這兩個部分通過“橋”連接起來,形成了一個靈活可擴展的結(jié)構(gòu)。下面的代碼結(jié)構(gòu)就能幫助你理解這一點。
橋接模式的代碼示例
假設我們要實現(xiàn)一個圖形繪制的程序,支持不同的圖形(圓形、方形)和不同的繪制方式(屏幕繪制、打印機繪制)。我們來看看怎么用橋接模式來實現(xiàn)。
#include <iostream>
#include <string>// 繪圖接口(實現(xiàn)類接口)
class DrawingAPI {
public:virtual void drawCircle(double x, double y, double radius) = 0;virtual ~DrawingAPI() = default;
};// 具體實現(xiàn):屏幕繪制
class ScreenDrawingAPI : public DrawingAPI {
public:void drawCircle(double x, double y, double radius) override {std::cout << "在屏幕上繪制圓形,位置: (" << x << ", " << y << "), 半徑: " << radius << std::endl;}
};// 具體實現(xiàn):打印機繪制
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; // 這里持有一個指向繪圖實現(xiàn)類的指針public:Shape(DrawingAPI* api) : drawingAPI(api) {} // 通過構(gòu)造函數(shù)注入具體實現(xiàn)類virtual void draw() = 0; // 繪制圖形的接口virtual void resize(double factor) = 0; // 調(diào)整圖形大小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); // 將繪制任務委托給具體實現(xiàn)}void resize(double factor) override {radius *= factor; // 調(diào)整圓形的半徑}
};int main() {ScreenDrawingAPI screenAPI; // 創(chuàng)建屏幕繪制實現(xiàn)PrinterDrawingAPI printerAPI; // 創(chuàng)建打印機繪制實現(xiàn)// 創(chuàng)建圓形對象,使用不同的繪制方式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
,它只是一個接口,并不做具體的繪制工作。任何具體的繪制方式(比如屏幕繪制、打印機繪制)都需要實現(xiàn)這個接口。
2. 具體的繪圖實現(xiàn)(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;}
};
這兩個類分別實現(xiàn)了 DrawingAPI
接口,提供了不同的繪制方式。ScreenDrawingAPI
在屏幕上繪制圓形,PrinterDrawingAPI
在打印機上繪制圓形。
3. 抽象類(Shape
)
class Shape {
protected:DrawingAPI* drawingAPI; // 持有一個繪圖實現(xiàn)類的指針public:Shape(DrawingAPI* api) : drawingAPI(api) {} // 通過構(gòu)造函數(shù)注入具體的繪圖實現(xiàn)virtual void draw() = 0; // 繪制圖形的接口virtual void resize(double factor) = 0; // 調(diào)整圖形大小
};
Shape
是一個抽象類,它定義了所有圖形的共同接口:draw()
和 resize()
。關鍵是它持有一個 DrawingAPI
的指針,這樣它可以將具體的繪制任務委托給實現(xiàn)類。
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); // 調(diào)用具體繪圖實現(xiàn)的drawCircle方法}void resize(double factor) override {radius *= factor; // 改變圓形的半徑}
};
Circle
類繼承自 Shape
,并實現(xiàn)了 draw()
和 resize()
方法。它通過 drawingAPI
指針來調(diào)用具體的繪制方法,實現(xiàn)了與繪制方式的解耦。
5. 客戶端代碼
在 main
函數(shù)中,我們創(chuàng)建了兩個 Circle
對象,分別使用了 ScreenDrawingAPI
和 PrinterDrawingAPI
作為繪制實現(xiàn)。通過調(diào)用 circle1.draw()
和 circle2.draw()
,我們可以看到兩個不同的繪制方式。
int main() {ScreenDrawingAPI screenAPI; // 屏幕繪制實現(xiàn)PrinterDrawingAPI printerAPI; // 打印機繪制實現(xiàn)// 創(chuàng)建兩個圓形對象,分別使用不同的繪制方式Circle circle1(1, 2, 3, &screenAPI);Circle circle2(5, 6, 4, &printerAPI);circle1.draw(); // 屏幕繪制圓形circle2.draw(); // 打印機繪制圓形circle1.resize(2.0); // 改變圓形大小circle1.draw(); // 再次繪制,使用屏幕繪制return 0;
}
總結(jié)
橋接模式的主要優(yōu)點就是解耦
。我們把抽象部分(如圖形類型)和實現(xiàn)部分(如繪制方式)分開,避免了兩者之間的緊耦合。這樣我們可以很方便地擴展新的圖形類型或新的繪制方式,而不需要修改現(xiàn)有的代碼。
比如,如果你以后需要支持新的繪制方式(比如在Web上繪制),你只需要實現(xiàn)一個新的 DrawingAPI
類,不用改動任何圖形類;同樣,如果你需要增加新的圖形類型(比如矩形),只需要擴展 Shape
類,不需要改動任何繪制實現(xiàn)。
橋接模式適用于需要將抽象和實現(xiàn)分離,并且它們可能會獨立變化的場景。
本文由mdnice多平臺發(fā)布