在設計模式中,適配器模式(英語:adapter pattern)有時候也稱封裝樣式或者封裝。將一個類的介面轉接成使用者所期待的。一個適配使得因介面不相容而不能在一起工作的類工作在一起,做法是將類別自己的介面包裹在一個已存在的類中。
有兩類適配器模式:
·對象適配器模式 - 在這種適配器模式中,適配器容納一個它我包裹的類的執行個體。在這種情況下,適配器調用被包裹對象的物理實體。
·類適配器模式 - 這種適配器模式下,適配器繼承自已實現的類(一般多重繼承來實現)。
由於在這裡類適配器我想不到什麼好一點的例子,就先說對象適配器吧,大家都知道C++ STL中的棧和隊列吧?在標準庫中有一個標準容器deque雙端隊列,他支援
前面刪除和插入,也支援後面刪除和插入,但是我們的queue是一個前出後進的,而stack是一個後進後出的,標準庫可並不去重新定義他們,而且是藉助基容器實現的,預設的情況下用的deque 如果你想改變,也可以使用vector啊,只需要如下寫代碼:
stack <int,vector<int>> sta;
就可以了,下面讓我們來完全實現一個適配器stack:
template<class Type,class BaseCon = deque<Type>> //模版預設參數指定為dequeclass Stack{private:BaseCon stack; //定義基容器public:void push(Type elem){stack.push_back(elem);}void pop(){stack.pop_back();}Type & top(){return stack.back();}bool empty(){return stack.empty();}signed int size(){return stack.size();}};int main(){Stack<int,vector<int>> stack;for(int i=1;i<10;i++)stack.push(i);while( !stack.empty() ){cout<<stack.top();stack.pop();}system("pause");return 0;}
不知道上面這個例子我有沒有扯遠,我個人比較喜歡STL,也研究過他的源碼,最近也在想著模仿stl寫一個自己的庫
回到正題,這個程式中的satck也就是標準庫中標準實現的棧,只是這裡我找不到以前寫的那個記憶體 Clerk,不然就可以完全類比並改編了,該stack就叫做容器的適配器,他以現成的介面,轉變為自己想要的介面,這就是適配器模式,在標準庫中的迭代器適配器,和函數對象適配器都是採用這種模式,比如迭代器適配器中的back_insert迭代器,就是藉助了標準容器的push_back函數,一定要有這個函數的容器才可以用這個back_insert,相信也很好理解了,晚了,睡覺了!!