适配器模式(Adapter Pattern)
定义
将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适配器设计模式也并不复杂,适配器它是主要作用是将一个类的接口转换成客户希望的另外一个接口这样使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式有两种:1.类的适配器 2.对象适配器,对象适配器更多一些。
类适配器,使用多继承实现。对象适配器使用用聚合实现。能用聚合实现的一般不推荐使用继承,所以类适配器使用较少。
常用场景
想使用一个已经存在的类,但接口不符合你的要求
优点
可以将不符合要求的接口转换为需要的接口
缺点
凭空多了一个适配类
C++实现
例子:
举例:假设一家电脑公司有最近收购了一家电脑公司,两家公司的电脑都有各自的开机流程。
收购公司电脑开机接口是:Open();
被收购公司电脑开机接口是:SpecialOpen();
现在领导要求在现有的电脑制作流程上去生产被收购公司的电脑。单很明显二者接口不一样啊。此时适配器模式就有用了。
类适配器
对象适配器
class ComputerNew
{
public:
virtual void Open() = 0;
};
class ComputerOld
{
public:
void SpecialOpen() {std::cout << "oldcomputer is opening..." << std::endl;}
};
// 类适配器
class ComputerClassAdapter : public ComputerNew, public ComputerOld
{
public:
ComputerClassAdapter()
{
std::cout << "类适配器: " << std::endl;
}
void Open()
{
DoConvert();
SpecialOpen();
}
private:
void DoConvert()
{
std::cout << "oldcomputer convert to newcomputer" << std::endl;
}
};
// 对象适配器
class ComputerObjectAdapter : public ComputerNew
{
public:
ComputerObjectAdapter(const ComputerOld& computer)
{
std::cout << "对象适配器: " << std::endl;
std::cout << "oldcomputer convert to newcomputer" << std::endl;
m_computer = computer;
}
~ComputerObjectAdapter()
{
}
void Open()
{
m_computer.SpecialOpen();
}
private:
ComputerOld m_computer;
};
int main(int argc, char** argv)
{
ComputerNew* computer1 = new ComputerClassAdapter();
computer1->Open();
std::cout << std::endl;
ComputerOld* computerold = new ComputerOld();
ComputerNew* computernew = new ComputerObjectAdapter(*computerold);
computernew->Open();
delete computer1;
delete computerold;
delete computernew;
return 0;
}