提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
adaptor设计模式
核心作用
作为两个不同接口之间的中间转换者(尽可能避免修改已有源码,将变化隔离在适配器中),解决不同接口之间不兼容问题一、核心概念
目标接口(Target):定义客户所需接口,可以是一个抽象类或接口,也可以是具体类原接口(Adaptee):需要被“适配”的原接口,它是已经存在的类或接口等,包含了客户希望使用的某个方面或职责业务方法
适配器(Adapter):它的职责就是要把原接口转换成目标接口,对Adaptee和Target进行适配
注意事项
通常,apdator模式是解决已经存在的问题,即项目也许已经在服役了,并不是项目设计时使用模式
二、C++伪代码示例
假如某系统已经存在一套文件操作接口(FILE_IO类),但客户的使用的接口是符合POSIX规范的(STD_IO)
-------------------------------------------------------------------------
/*以适配打开open函数为例*/
/*原接口*/
class FILE_IO{
fopen(char * file_io_arg);
/*其它省略.......*/
};
/*目标接口*/
class STD_IO{
virtual open(char * std_io_arg);
/*其它省略.......*/
};
/*adaptor适配器,继承STD_IO*/
class STD_IO_ADAPTOR : public STD_IO{
private:
FILE_IO * adatee;
public:
/*构造函数*/
STD_IO_ADAPTOR(){
this->adatee = new FILE_IO();
}
/*析构函数*/
~STD_IO_ADAPTOR(){
delete this->adatee;
}
int open(char * std_io_arg){
/*这里用伪代码示意参数之间的转换,实际也许要复杂得多*/
char * file_io_arg = arg_transform(std_io_arg);
return this->adatee->open(file_io_arg);
}
};
总结
--------------------------------------------------------------------------
优点
适配器模式比较简单,就是再不修改原来接口的情况下使其适应另一种接口需求。
实际情况中,往往目标类和适配者类是已经存在的,这样就只需要额外加入一个适配器类即可。
通过引入一个适配器类来将目标类和适配者类解耦。
符合“开闭原则”,可以很方便的更换和新增适配器类。
缺点
过度的使用会让系统变得很复杂,比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现。