找回密码
 立即注册
首页 业界区 业界 设计模式之适配器模式(学习笔记)

设计模式之适配器模式(学习笔记)

这帜 2025-6-9 09:36:20
定义 

适配器模式是一种结构型设计模式,它允许将一个类的接口转换为客户端希望的另一个接口。适配器使得原本由于接口不兼容而不能一起工作的类可以协同工作。通过创建适配器类,可以将现有类的接口转换成目标接口,从而使这些类能够在一起工作。为什么使用适配器模式


  • 兼容性

    • 适配器模式能够解决由于接口不兼容而无法直接协作的问题,使得现有的类能够在新系统中复用。

  • 代码重用

    • 适配器模式允许在不修改现有代码的情况下,将其整合到新的代码结构中,实现代码的重用。

  • 灵活性

    • 通过适配器,可以在运行时动态地转换接口,增强了系统的灵活性和扩展性。

适配器模式的实现步骤


  • 目标接口

    • 定义客户端所期望的接口,即目标接口。

  • 现有接口

    • 定义一个已经存在的类,它的接口与目标接口不兼容。

  • 适配器类

    • 对象适配器

      • 继承目标接口,通过组合持有现有类的实例,并在实现目标接口的方法中调用现有类的方法,实现接口转换。

    • 类适配器

      • 继承目标接口并同时继承现有类,通过覆盖现有类的方法来实现接口转换。


优缺点和适用场景

优点


  • 兼容性

    • 可以使得不兼容的接口一起工作,解决了接口不兼容的问题。

  • 代码重用

    • 可以在不修改现有类的情况下使用这些类,实现代码重用。

  • 灵活性

    • 可以动态地改变接口的实现,增强系统的灵活性和扩展性。

缺点


  • 复杂性增加

    • 需要额外编写适配器类,增加了系统的复杂性。

  • 性能开销

    • 适配器模式会增加一个额外的层次,可能会带来一定的性能开销。

适用场景


  • 接口转换

    • 当现有类的接口与目标接口不兼容时,可以使用适配器模式进行接口转换。

  • 遗留系统整合

    • 在整合遗留系统时,可以使用适配器模式将现有系统的接口转换为新系统所需的接口。

  • 第三方库整合

    • 当需要使用第三方库的类,而这些类的接口与系统不兼容时,可以使用适配器模式。

例子:使用适配器模式将旧系统的接口转换为新系统的接口
  1. #include <iostream>
  2. #include <memory>
  3. #include <string>
  4. // 目标接口:新的日志接口
  5. class Logger {
  6. public:
  7.     virtual ~Logger() {}
  8.     virtual void logMessage(const std::string& message) const = 0;
  9. };
  10. // 现有接口:旧的日志系统
  11. class OldLogger {
  12. public:
  13.     void writeLog(const std::string& msg) const {
  14.         std::cout << "Old Logger: " << msg << std::endl;
  15.     }
  16. };
  17. // 对象适配器类:将旧的日志系统适配为新的日志接口
  18. class LoggerAdapter : public Logger {
  19. private:
  20.     std::shared_ptr<OldLogger> oldLogger;
  21. public:
  22.     LoggerAdapter(std::shared_ptr<OldLogger> oldLogger) : oldLogger(oldLogger) {}
  23.     void logMessage(const std::string& message) const override {
  24.         oldLogger->writeLog(message);
  25.     }
  26. };
  27. // 类适配器类:将旧的日志系统适配为新的日志接口
  28. class ClassLoggerAdapter : public Logger, private OldLogger {
  29. public:
  30.     void logMessage(const std::string& message) const override {
  31.         writeLog(message);
  32.     }
  33. };
  34. int main() {
  35.     // 使用旧的日志系统
  36.     std::shared_ptr<OldLogger> oldLogger = std::make_shared<OldLogger>();
  37.     oldLogger->writeLog("Logging with the old logger");
  38.     // 使用对象适配器将旧的日志系统适配为新的日志接口
  39.     std::shared_ptr<Logger> logger = std::make_shared<LoggerAdapter>(oldLogger);
  40.     logger->logMessage("Logging with the object adapter");
  41.     // 使用类适配器将旧的日志系统适配为新的日志接口
  42.     std::shared_ptr<Logger> classLogger = std::make_shared<ClassLoggerAdapter>();
  43.     classLogger->logMessage("Logging with the class adapter");
  44.     return 0;
  45. }
复制代码
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册