适配器模式:
想使用一个已经存在的类,但接口不符合你的要求。通过适配器将这个接口改变成想要的接口。将一个类的接口转换成客户希望的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
它包括类适配器和对象适配器,本文的两个例子都针对的是对象适配器。
1、在STL中就用到了适配器模式,STL实现了一种数据结构,称为双端队列,它支持头删除头添加,也支持尾删除尾添加,STL实现栈和队列的时候,并没有重新定义他们,而是借助双端队列实现的。这里双端队列就扮演了适配器的角色,队列用到了它的尾插入,头删除。栈用到了它的尾插入,尾删除。假设栈和队列都是一种顺序容器,有两种操作,压入和弹出。
//双端队列
class Deque
{
public:
void push_back(int x){
cout<<"双端队列尾部插入"<<endl;
}
void push_front(int x){
cout<<"双端队列头部插入"<<endl;
}
void pop_back(){
cout<<"双端队列尾部删除"<<endl;
}
void pop_front(){
cout<<"双端队列头部删除"<<endl;
}
};
//顺序容器
class Sequence
{
public:
virtual void push(int x) = 0;
virtual void pop() = 0;
};
//栈
class Stack :public Sequence
{
private:
Deque deque; //双端队列
public:
void push(int x)
{
deque.push_back(x);
}
void pop()
{
deque.pop_back();
}
};
//队列
class Queue :public Sequence
{
private:
Deque deque; //双端队列
public:
void push(int x)
{
deque.push_back(x);
}
void pop()
{
deque.pop_front();
}
};
int main()
{
Sequence * stack = new Stack;
Sequence * queue = new Queue;
stack->push(1);
stack->push(2);
stack->pop();
queue->push(1);
queue->push(2);
queue->pop();
return 0;
}
2、上面的STL的例子是将一个已经存在的类的接口进行封装,得到有符合要求的接口的类 ,适配器是开始就存在 。下面我们来看一个构造适配器的例子。
假设你们的公司A最近刚刚收购了公司B,两家公司都有各自的人员管理系统,两个系统都可以对应获取每一个员工的姓名。
你们公司系统的接口是:GetAName();
被收购的B公司的接口是:GetBName();
现在领导要求用我们的公司的系统也可以查询B公司的人员信息,但很明显二者的接口不一样。此时适配器模式就有用了。
class MangeSystemA
{
public:
virtual void GetAName()
{
cout<<"获得公司A中的员工信息"<<endl;
}
};
class MangeSystemB
{
public:
virtual void GetBName()
{
cout<<"获得公司B中的员工信息"<<endl;
}
};
//适配器
class Adapter :public MangeSystemA
{
private:
MangeSystemB *m_pB;
public:
Adapter(MangeSystemB *B)
{
m_pB = B;
}
void GetAName()
{
m_pB->GetBName();
}
};
int main()
{
MangeSystemB *B = new MangeSystemB;
//创建适配器
MangeSystemA *A1 = new Adapter(B); //A公司的系统
A1->GetAName();
MangeSystemA *A2 = new MangeSystemA;
A2->GetAName();
return 0;
}
其中部分内容参考于:https://blog.csdn.net/a369189453/article/details/81105950
https://blog.csdn.net/wuzhekai1985/article/details/6665542