适配器模式
将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作。(对象适配器(一继承一组合)、类适配器(多继承)不推荐使用)
动机
在软件构建过程中,由于应用环境的变化,常常需要把一些现存的对象放在新的环境中使用,但是新的环境要求的接口是现存对象所满足不了的。
角色扮演
抽象目标类(Target)(新的接口或者类)
定义一个客户所需的接口,可以是一个抽象类或接口,也可以是具体类
适配器类(Adapter)
它可以调用另一个接口,作为一个转换器,对Adaptee和Targer进行组合,适配,它是适配器模式的核心
适配者类(Adaptee)(老的接口或者类)
即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类,有客户需要的方法或者实现
举例说明
比如qq会员,各种会员类型,黄砖、黑砖、绿砖、红砖、紫砖、粉砖,不同会员标识,可享受不同的待遇和福利,可以拥有不同的权利,干不同的事。
//目标接口类,
class Target
{
public:
Target();
virtual ~Target();
virtual void newprocess() = 0;//客户定义的接口
protected:
private:
};
//适配器类
class Adapter : public Target
{
public:
Adapter( Adaptee* pAdaptee){}
virtual ~Adapter();
void newprocess(){ //实现目标类的接口
cout<< "客户需要的新接口" << endl;
this->pAdaptee->oldprocess(); //组合适配者的接口
}
protected:
private:
Adaptee* pAdaptee; //组合适配者
};
//适配者类,提供旧的接口
class Adaptee
{
public:
Adaptee();
virtual ~Adaptee();
void oldprocess(){ //旧的接口实现
cout << "使用了旧的接口 << endl;
}
protected:
private:
};
demo:
int main(){
Adaptee *adtee = new Adaptee();
Adapter *adter = new Adapter(adtee);
adter->newprocess();
return 0;
}
结果:
优点
1:将目标类和适配器类解耦,通过引入一个适配器类来重用现有的适配者类,无需修改原有结构
2.:增加了类的 透明性和复用性,将具体的业务实现过程封装在适配器中,对于客户端类而言是透明的,而且提高了适配者的复用性,两全其美,同一适配者类可以在多个不同的系统中复用
3:灵活性和高扩展性都非常好,在不修改原有的代码基础上,选择适配器来扩展业务需要,完全符合开闭原则
缺点
1:一次只能适配一个适配者类,不能同时适配多个适配者
2:适配者类不能为最终类
3:目标抽象类只能为接口,不能为类,使用有一定的局限性
应用场景
Adapter模式主要用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用