一、适配器模式
适配器模式是一种结构型模式。它通过加入一个适配器,把原本一些不兼容的接口结合到一起,使它们可以一起工作。
二、结构与参与者
Target:定义Client使用的与特定领域相关的接口;
Client:与Target接口对象协同;
Adaptee:一个已经存在的,需要适配的接口;
Adapter:对Adaptee的接口与Target接口进行适配;
三、示例
现有一个解析图片的类PictureResolver,它可以解析bmp和png图片,还有一个可以解析jpg图片的类JPGResolver,它们定义如下:
class PictureResolver {
public:
PictureResolver() {}
virtual void resolve(const char *fileName) {
if (fileName.find(".bmp") + 4 == fileName.size())
cout << "resolve bmp picture : " << fileName << endl;
else if (fileName.find(".png") + 4 == fileName.size())
cout << "resolve png picture : " << fileName << endl;
}
};
class JPGResolver {
public:
JPGResolver() {};
void resolve(const char *fileName) {
cout << "resolve jpg picture : " << fileName << endl;
}
};
想要把解析jpg的功能也加到PictureResolver类里面,这时可以用适配器模式来实现。
先加一个JPGResolver的适配器JPGResolverAdapter 类:
class JPGResolverAdapter {
public:
JPGResolverAdapter() {}
JPGResolver jpgResolver;
void resovle(const char *_fileName) {
jpgResolver.resolve(_fileName);
}
};
然后,实现一个有解析jpg功能的PictureResolverWithJPG类:
class PictureResolverWithJPG: public PictureResolver {
public:
PictureResolverWithJPG() {}
JPGResolverAdapter jpgResolverAdapter;
void resolve(const char *_fileName) {
string fileName = _fileName;
f (fileName.find(".jpg") + 4 == fileName.size())
jpgResolverAdapter.resovle(_fileName);
else
PictureResolver ::resolve(_fileName);
}
};
使用
PictureResolverWithJPG*resolver = new PictureResolverWithJPG();
resolver->resolve(“picture.bmp”);
resolver->resolve(“picture.jpg”);
总结
优点:
- 把两个没有关联的类一起运行。
- 提高了类的服用。
- 增加了类的透明度。
- 灵活性好。
缺点:
- 过多地使用适配器,会让系统变复杂。