定义
适配器模式是一种结构型设计模式,它允许将一个类的接口转换为客户端希望的另一个接口。适配器使得原本由于接口不兼容而不能一起工作的类可以协同工作。通过创建适配器类,可以将现有类的接口转换成目标接口,从而使这些类能够在一起工作。
为什么使用适配器模式
-
兼容性
- 适配器模式能够解决由于接口不兼容而无法直接协作的问题,使得现有的类能够在新系统中复用。
-
代码重用
- 适配器模式允许在不修改现有代码的情况下,将其整合到新的代码结构中,实现代码的重用。
-
灵活性
- 通过适配器,可以在运行时动态地转换接口,增强了系统的灵活性和扩展性。
适配器模式的实现步骤
-
目标接口
- 定义客户端所期望的接口,即目标接口。
-
现有接口
- 定义一个已经存在的类,它的接口与目标接口不兼容。
-
适配器类
-
对象适配器
- 继承目标接口,通过组合持有现有类的实例,并在实现目标接口的方法中调用现有类的方法,实现接口转换。
-
类适配器
- 继承目标接口并同时继承现有类,通过覆盖现有类的方法来实现接口转换。
优缺点和适用场景
优点
-
兼容性
- 可以使得不兼容的接口一起工作,解决了接口不兼容的问题。
-
代码重用
- 可以在不修改现有类的情况下使用这些类,实现代码重用。
-
灵活性
- 可以动态地改变接口的实现,增强系统的灵活性和扩展性。
缺点
-
复杂性增加
- 需要额外编写适配器类,增加了系统的复杂性。
-
性能开销
- 适配器模式会增加一个额外的层次,可能会带来一定的性能开销。
适用场景
-
接口转换
- 当现有类的接口与目标接口不兼容时,可以使用适配器模式进行接口转换。
-
遗留系统整合
- 在整合遗留系统时,可以使用适配器模式将现有系统的接口转换为新系统所需的接口。
-
第三方库整合
- 当需要使用第三方库的类,而这些类的接口与系统不兼容时,可以使用适配器模式。
例子:使用适配器模式将旧系统的接口转换为新系统的接口
#include <iostream> #include <memory> #include <string> // 目标接口:新的日志接口 class Logger { public: virtual ~Logger() {} virtual void logMessage(const std::string& message) const = 0; }; // 现有接口:旧的日志系统 class OldLogger { public: void writeLog(const std::string& msg) const { std::cout << "Old Logger: " << msg << std::endl; } }; // 对象适配器类:将旧的日志系统适配为新的日志接口 class LoggerAdapter : public Logger { private: std::shared_ptr<OldLogger> oldLogger; public: LoggerAdapter(std::shared_ptr<OldLogger> oldLogger) : oldLogger(oldLogger) {} void logMessage(const std::string& message) const override { oldLogger->writeLog(message); } }; // 类适配器类:将旧的日志系统适配为新的日志接口 class ClassLoggerAdapter : public Logger, private OldLogger { public: void logMessage(const std::string& message) const override { writeLog(message); } }; int main() { // 使用旧的日志系统 std::shared_ptr<OldLogger> oldLogger = std::make_shared<OldLogger>(); oldLogger->writeLog("Logging with the old logger"); // 使用对象适配器将旧的日志系统适配为新的日志接口 std::shared_ptr<Logger> logger = std::make_shared<LoggerAdapter>(oldLogger); logger->logMessage("Logging with the object adapter"); // 使用类适配器将旧的日志系统适配为新的日志接口 std::shared_ptr<Logger> classLogger = std::make_shared<ClassLoggerAdapter>(); classLogger->logMessage("Logging with the class adapter"); return 0; }
玄机博客
© 版权声明
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
THE END
暂无评论内容