通過例子學設計模式之--橋接模式以及使用場景說明(C++實現)
阿新 • • 發佈:2018-12-30
橋是一種結構。橋接模式的類圖和橋很像,是一種結構型的設計模式。
通常情況下,橋兩邊各有一個橋墩,每個橋墩我們可以理解為一個抽象類,或者是一個變化。中間的橋樑我們可以理解為類的“關聯”,這個關聯就是聚合。這樣就組成了橋接模式。它可以處理2個維度同時變化的情況。其實也可以處理多個維度的變化情況,理解上可以想成橋墩有多個,而不僅僅是2個。那麼橋樑也不止1個,而是多個。
比如一個物件,如果A維度有3種變化,B維度有4種變化,C維度有2中變化。直接使用繼承的方式,會有3*4*2種可能,即出現24個類,而且每個類都包含A B C維度,職責不單一,擴充套件性很差。
使用橋接模式,通過組合的方式,那麼只有3+4+2=9個類,同時每個類的職責都單一。擴充套件性也很強。
通常情況下,橋兩邊各有一個橋墩,每個橋墩我們可以理解為一個抽象類,或者是一個變化。中間的橋樑我們可以理解為類的“關聯”,這個關聯就是聚合。這樣就組成了橋接模式。它可以處理2個維度同時變化的情況。其實也可以處理多個維度的變化情況,理解上可以想成橋墩有多個,而不僅僅是2個。那麼橋樑也不止1個,而是多個。
比如一個物件,如果A維度有3種變化,B維度有4種變化,C維度有2中變化。直接使用繼承的方式,會有3*4*2種可能,即出現24個類,而且每個類都包含A B C維度,職責不單一,擴充套件性很差。
使用橋接模式,通過組合的方式,那麼只有3+4+2=9個類,同時每個類的職責都單一。擴充套件性也很強。
還是用例子說明吧。比如車至少有2個維度的變化,一個是型別,有橋車,貨車,跑車等;一個是顏色,比如有白色的車,有黑色的車等等。當然也會有其它維度的變化。我們用C++程式碼實現這個例子如下:
class Paint//噴漆 { public: virtual void Do() = 0; }; class WhitePaint : public Paint //白色噴漆 { public: virtual void Do() { printf("噴白色的漆\r\n"); } }; class BluePaint : public Paint //藍色噴漆 { public: virtual void Do() { printf("噴藍色的漆\r\n"); } }; class BlackPaint : public Paint //黑色噴漆 { public: virtual void Do() { printf("噴黑色的漆\r\n"); } }; class Car { public: virtual void SetPaint(Paint* p) { m_Paint = p; } virtual Paint* GetPaint() { return m_Paint; } virtual void DoPaint() = 0; //噴漆 virtual void Run() = 0; //開車 protected: Paint* m_Paint; }; class SportsCar : public Car //跑車 { public: virtual void DoPaint() { printf("跑車噴漆: "); m_Paint->Do(); } virtual void Run() { printf("跑車跑起來,誰也追不上\r\n\r\n"); } }; class Trunk : public Car //貨車 { public: virtual void DoPaint() { printf("貨車噴漆: "); m_Paint->Do(); } virtual void Run() { printf("貨車跑的慢,但載東西最多\r\n\r\n"); } }; class Sedan : public Car //轎車 { public: virtual void DoPaint() { printf("轎車噴漆: "); m_Paint->Do(); } virtual void Run() { printf("轎車最適合上班族代步使用\r\n\r\n"); } }; void TestBridge() { Car* sport = new SportsCar; Car* trunk = new Trunk; Car* sedan = new Sedan; Paint* white = new WhitePaint; Paint* black = new BlackPaint; Paint* blue = new BluePaint; sport->SetPaint(white); sport->DoPaint(); sport->Run(); trunk->SetPaint(black); trunk->DoPaint(); trunk->Run(); sedan->SetPaint(blue); sedan->DoPaint(); sedan->Run(); }