标签:style blog http 使用 os io 2014 ar
适配器模式:将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。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章
标签:style blog http 使用 os io 2014 ar
原文地址:http://blog.csdn.net/nestler/article/details/38346173