设计模式(5)适配器模式
适配器模式
情景
将一个类的接口转换成客户希望的另一个接口。Adapter 模式使得原本由于接口不兼容而不能在一起工作的那些类可以一起工作。
在这个网站里有这么一个例子
设计一个股票市场检测程序,它下载大量的XML格式的股票数据。在开发过程中,整合一个第三方智能分析函数库,但是这个库只兼容JSON格式。这个时候我们需要修改程序的代码,来设计一个新的接口。
解决
适配器将我们对象的转换过程隐藏。我们可以给每一个类创建将XML转换JSON格式的适配器,然后我们的程序可以通过适配器来和函数库交流。
//设计一个Target类作为客户端
class Target {
public:
virtual ~Target() = default;
virtual std::string Request() const {
return "Target: The default target's behavior.";
}
};
//我们提供的服务需要兼容Target,现在是不行的
class Adaptee {
public:
std::string SpecificRequest() const {
return ".eetpadA eht fo roivaheb laicepS";
}
};
//C++多重继承,用一个适配器整合Target和Adaptee
class Adapter : public Target, public Adaptee {
public:
Adapter() {}
std::string Request() const override {
std::string to_reverse = SpecificRequest();
std::reverse(to_reverse.begin(), to_reverse.end());
return "Adapter: (TRANSLATED) " + to_reverse;
}
};
总结
- 当你希望使用某个类, 但是其接口与其他代码不兼容时, 可以使用适配器类。
- 复用这样一些类, 他们处于同一个继承体系, 并且他们又有了额外的一些共同的方法, 但是这些共同的方法不是所有在这一继承体系中的子类所具有的共性。
- 适配器没有修改原有代码,并且仍然保证了单一职责,这是他的优点,但他新增加了接口和类这使得代码更加复杂。