C++适配器模式的解析

码农公社  210.net.cn   210= 1024  10月24日一个重要的节日--码农(程序员)节

适配器模式:

    将一个类的接口转换成客户端期待的另一个接口。适配器模式使得原本由于接口不兼容而不能在一起工作的那些类可以一起工作。  


客户端需要一个target(目标)接口,但是不能直接重用已经存在的adaptee(适配者)类,因为它的接口和target接口不一致,所以需要adapter(适配器)将adaptee转换为target接口。前提是target接口和已存在的适配者adaptee类所做的事情是相同或相似,只是接口不同且都不易修改。


在适配器模式中,通过增加一个新的适配器类来解决接口不兼容的问题,使得原本没有任何关系的类可以协同工作。根据适配器类与适配者类的关系不同,适配器模式可分为对象适配器类适配器两种,在对象适配器模式中,适配器与适配者之间是组合关系;在类适配器模式中,适配器与适配者之间是继承(或实现)关系。


  1. 类适配器模式(adapter pattern)结构图:

    1.gif


举一个SD卡的例子,SD卡就是目标,主机上的插口就是待适配的。


   实现代码:


#include <iostream>
using namespace std;
class SD
{
public:
virtual void Request()=0;
};
class PC{
public:
void download(){
cout<<"下载....."<<endl;
}
};
class Adapter :public SD,public PC
{
public:
virtual void Request()
{
cout<<"把SD卡插入读卡器,读卡器进行适配"<<endl;
download();
cout<<"下载完成"<<endl;
}
};
int main()
{
Adapter p;
p.Request(); // RealSubject
return 0;
}


gh.png


优点:

适配器可以重定义Adaptee的部分行为,相当于子类覆盖父类的部分实现方法。仅仅引入了一个对象,并不需要额外的引用来间接得到Adaptee  

缺点:由于适配器直接继承了Adaptee,使得适配器不能和Adaptee的子类一起工作,因为继承是静态的关系,当适配器继承了Adaptee后,就不可能再去处理 Adaptee的子类了


2.对象适配器模式

1.gif


代码实现:


#include <iostream>
using namespace std;
class SD
{
public:
virtual void Request()=0;
};
class PC{
public:
void download(){
cout<<"下载....."<<endl;
}
};
class Adapter :public SD
{
public:
    PC a;
    Adapter(PC b){
        a=b;    
    }
virtual void Request()
{
cout<<"把SD卡插入读卡器,读卡器进行适配"<<endl;
a.download();
cout<<"下载完成"<<endl;
}
};
int main()
{
PC b;
Adapter p(b);
p.Request(); // RealSubject
return 0;
}


优点:目标类和适配者类解耦,增加了类的透明性和复用性,同时系统的灵活性和扩展性都非常好,更换适配器或者增加新的适配器都非常方便,符合"开闭原则"  

缺点:过多的使用适配器,会让系统非常零乱,不易整体进行把握。

评论