设计模式(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;
}
};
总结
- 当你希望使用某个类, 但是其接口与其他代码不兼容时, 可以使用适配器类。
- 复用这样一些类, 他们处于同一个继承体系, 并且他们又有了额外的一些共同的方法, 但是这些共同的方法不是所有在这一继承体系中的子类所具有的共性。
- 适配器没有修改原有代码,并且仍然保证了单一职责,这是他的优点,但他新增加了接口和类这使得代码更加复杂。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧