适配器模式:将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。UML图如下所示:
从上图可以看出,Client需要一个名为methodA的接口,而类Adaptee只拥有一个名为methodB的接口。这时,就需要一个适配器来将接口做一个转换,使Client对methodA的调用能够转接到methodB。这个转接的任务就落在了适配器Adapter身上。这种设计模式还是比较好懂的,在C++
STL中就大量运用了这种模式。例如,容器deque的接口经过适配器的转换就成了stack或queue所需的接口;容器vector的接口经过适配器的转换就成了priority_queue所需的接口。下面仿照STL写一个stack容器,它运用了适配器模式。
#include <iostream> #include <string> #include <deque> using namespace std; // Adapter template <typename T> class MyStack { public: // 客户所期待的接口 void push(const T &x) { dq.push_back(x); } // 客户所期待的接口 void pop() { if (!dq.empty()) dq.pop_back(); } // 客户所期待的接口 T& top() { if (!dq.empty()) return dq.back(); else throw exception("Stack is empty!"); } private: deque<T> dq; // 需要适配的对象(adaptee) }; int main() { MyStack<int> dq; dq.push(1); dq.push(2); cout << "Top = " << dq.top() << endl; dq.push(3); dq.push(4); cout << "Top = " << dq.top() << endl; dq.pop(); cout << "Top = " << dq.top() << endl; system("pause"); return 0; }
上面的例子中,我需要一个stack容器,也就是需要stack对应特性的接口,但没有现成的stack容器。这时就需要以deque作为底层容器,适当的修改它的接口,使它能够满足我们的需求。适配器模式使得接口间相互兼容,但使用它的前提是:在不太容易修改接口的时候使用适配器模式。也就是说,软件在设计之初就应该同一接口。
参考:
《大话设计模式》第17章
原文:http://blog.csdn.net/nestler/article/details/38346173