首页 > 代码库 > 【设计模式】适配器模式

【设计模式】适配器模式

适配器模式:将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。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章