1. 程式人生 > >最常用的設計模式---介面卡模式(C++實現)

最常用的設計模式---介面卡模式(C++實現)

介面卡模式屬於結構型的設計模式,它是結構型設計模式之首(用的最多的結構型設計模式)。

介面卡設計模式也並不複雜,介面卡它是主要作用是將一個類的介面轉換成客戶希望的另外一個介面這樣使得原本由於介面不相容而不能一起工作的那些類可以一起工作。介面卡模式有兩種:1.類的介面卡 2.物件介面卡,物件介面卡更多一些。

(介面卡模式和裝飾模式很類似,下面一篇我們會學習裝飾者模式,並分析他們之間的區別)

示例:比如你在網上買了一個手機,但是買家給你發回來了一個3接頭的充電器,但是恰好你又沒有3接頭的插槽,只有2個介面的插槽,於是你很直然地便會想到去找你個3介面轉兩介面的轉換器。簡單的分析下這個轉換器便是我們這裡的介面卡Adapter。三相插頭便是我們要適配的Adaptee,兩相插

類介面卡

-----在我看來C++的類介面卡的用多重繼承實現,並提供適配後的介面。


這是你的三相插頭

class ThreePhaseOutlet
{
public:
	void doThreePhasePlugin()
	{
		cout<<"三相插頭強勢插入!"<<endl;
	}
};
這是你想要的兩相插頭
class TwoPhaseOutlet 
{
public:
	virtual void doPlugin() = 0;
};
然後你將需要找到一個轉接頭,將三相插頭轉換為“兩相插頭”
class OutletConvertor: public TwoPhaseOutlet,public ThreePhaseOutlet
{
public:
	void doPlugin()
	{
		doConvertor();
		doThreePhasePlugin();
	}	
        void doConvertor()
	{
		cout<<"三相插頭轉為兩廂插頭!"<<endl;
	}
};
現在你可以強勢插入兩相的插口了。
TwoPhaseOutlet* outlet = new OutletConvertor();
outlet->doPlugin();

物件介面卡模式-----物件介面卡是將需要適配的物件進行包裝然後提供適配後的介面。

物件介面卡的 三相插口和轉接頭的程式碼和上面一致。只是整合步驟不一致

class OutletConvertor : public TwoPhaseOutlet
{
public:
	void doPlugin()
	{
		doConvertor();
		m_out.doThreePhasePlugin();
	}
	void doConvertor()
	{
		cout<<"三相插頭轉為兩廂插頭!"<<endl;
	}
	ThreePhaseOutlet m_out;
};
物件介面卡相比類介面卡來說更加靈活,他可以選擇性適配自己想適配的物件。例如我們下面把程式碼改成這樣,你也許就會明白為什麼我這樣說:
class OutletConvertor : public TwoPhaseOutlet
{
public:
	OutletConvertor(ThreePhaseOutlet out)
	{
		m_out = out;
	}
	void doPlugin()
	{
		doConvertor();
		m_out.doThreePhasePlugin();
	}
	void doConvertor()
	{
		cout<<"三相插頭轉為兩廂插頭!"<<endl;
	}
	ThreePhaseOutlet m_out;
};

我們在構造的時候將具體需要適配的適配物件傳入,這樣便可以根據傳入不同的物件,從而對該物件進行適配。而類介面卡卻無法選擇物件,他是對整個類進行適配。也就是把所有的三相插口全部轉換為兩相的,而不是針對某一個。