1. 程式人生 > >通過例子學設計模式之--橋接模式以及使用場景說明(C++實現)

通過例子學設計模式之--橋接模式以及使用場景說明(C++實現)

             橋是一種結構。橋接模式的類圖和橋很像,是一種結構型的設計模式。
            通常情況下,橋兩邊各有一個橋墩,每個橋墩我們可以理解為一個抽象類,或者是一個變化。中間的橋樑我們可以理解為類的“關聯”,這個關聯就是聚合。這樣就組成了橋接模式。它可以處理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();

}