1. 程式人生 > >設計模式C++實現(3)——介面卡模式

設計模式C++實現(3)——介面卡模式

        軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了面向物件程式語言的重要特性:封裝、繼承、多型,真正領悟設計模式的精髓是可能一個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用C++寫了個小例子,加深一下理解。主要參考《大話設計模式》和《設計模式:可複用面向物件軟體的基礎》(DP)兩本書。本文介紹介面卡模式的實現。

        DP上的定義:介面卡模式將一個類的介面轉換成客戶希望的另外一個介面,使得原本由於介面不相容而不能一起工作的那些類可以一起工作。它包括類介面卡和物件介面卡,本文針對的是物件介面卡。舉個例子,在STL中就用到了介面卡模式。STL實現了一種資料結構,稱為雙端佇列(deque),支援前後兩段的插入與刪除。STL實現棧和佇列時,沒有從頭開始定義它們,而是直接使用雙端佇列實現的。這裡雙端佇列就扮演了介面卡的角色。佇列用到了它的後端插入,前端刪除。而棧用到了它的後端插入,後端刪除。假設棧和佇列都是一種順序容器,有兩種操作:壓入和彈出。

下面給出相應的UML圖,與DP上的圖差不多。


        根據上面的UML圖,很容易給出實現。

//雙端佇列
class Deque
{
public:
	void push_back(int x) { cout<<"Deque push_back"<<endl; }
	void push_front(int x) { cout<<"Deque push_front"<<endl; }
	void pop_back() { cout<<"Deque pop_back"<<endl; }
	void pop_front() { cout<<"Deque pop_front"<<endl; }
};
//順序容器
class Sequence
{
public:
	virtual void push(int x) = 0;
	virtual void pop() = 0;
};
//棧
class Stack: public Sequence
{
public:
	void push(int x) { deque.push_back(x); }
	void pop() { deque.pop_back(); }
private:
	Deque deque; //雙端佇列
};
//佇列
class Queue: public Sequence
{
public:
	void push(int x) { deque.push_back(x); }
	void pop() { deque.pop_front(); }
private:
	Deque deque; //雙端佇列
};

       使用方式如下:

int main()
{
	Sequence *s1 = new Stack();
	Sequence *s2 = new Queue();
	s1->push(1); s1->pop();
	s2->push(1); s2->pop();
	delete s1; delete s2;
	return 0;
}