适配器模式
定义:将某个类的接口转换为接口客户所需的类型。换句话说,适配器模式解决的问题是,使得原本由于接口不兼容而不能一起工作、不能统一管理的那些类可以在一起工作、可以进行统一管理。做法是将类自己的接口包裹在一个已存在的类中。
举例:这里有厨师接口 ICooker、程序员接口 IProgrammer,分别用于定义他们各自工种的具体工作。然后又定义了全聚德的厨师 QjdCooker、京东的程序员JdProgrammer。这些不同的工种所做的工作都各自是不同的,无法进行统一管理,协同工作。所以,此时就需要定义一个员工适配器接口 IWorkerAdapter,用于将这些不同的工种进行统一管理。
使用场景:适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。
角色:
目标对象:target
被适配对象:adaptee
适配器:adapter
类模式适配器
class Target//目标对象
{
public:
Target();
virtual ~Target();
virtual void Request();//定义标准接口
};
void Target::Request()
{
cout << "Target::Request()" << endl;
}
class Adaptee//被适配对象
{
public:
Adaptee();
~Adaptee();
void SpecificRequest();
};
void Adaptee::SpecificRequest()
{
cout << "Adaptee::SpecificRequest()" << endl;
}
class Adapter:public Target,private Adaptee//类模式适配器
{
public:
Adapter();
~Adapter();
virtual void Request();//实现Target定义的Request接口
};
void Adapter::Request()
{
cout << "Adapter::Request()" << endl;
this->SpecificRequest();
cout << "----------------------------" <<endl;
}
int main()
{
//类模式Adapter
Target* pTarget = new Adapter();
pTarget->Request();
return 0;
}
对象模式适配器
class Target//目标对象
{
public:
Target();
virtual ~Target();
virtual void Request();//定义标准接口
};
void Target::Request()
{
cout << "Target::Request()" << endl;
}
class Adaptee//被适配对象
{
public:
Adaptee();
~Adaptee();
void SpecificRequest();
};
void Adaptee::SpecificRequest()
{
cout << "Adaptee::SpecificRequest()" << endl;
}
//对象模式,适配器类,继承Target类,采用组合的方式实现Adaptee的复用
class Adapter1:public Target
{
public:
Adapter1(Adaptee* adaptee);
Adapter1();
~Adapter1();
virtual void Request();//实现Target定义的Request接口
private:
Adaptee* _adaptee;
};
//对象模式的Adapter
Adapter1::Adapter1():_adaptee(new Adaptee)
{
}
Adapter1::Adapter1(Adaptee* _adaptee)
{
this->_adaptee = _adaptee;
}
int main()
{
//对象模式Adapter1
Adaptee* ade = new Adaptee();
Target* pTarget1= new Adapter1(ade);
pTarget1->Request();
//对象模式Adapter2
Target* pTarget2 = new Adapter1();
pTarget2->Request();
return 0;
}