首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

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

编程知识
2024年07月18日 14:05

定义 

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

为什么使用适配器模式

  1. 兼容性

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

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

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

适配器模式的实现步骤

  1. 目标接口

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

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

    • 对象适配器

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

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

优缺点和适用场景

优点

  1. 兼容性

    • 可以使得不兼容的接口一起工作,解决了接口不兼容的问题。
  2. 代码重用

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

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

缺点

  1. 复杂性增加

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

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

适用场景

  1. 接口转换

    • 当现有类的接口与目标接口不兼容时,可以使用适配器模式进行接口转换。
  2. 遗留系统整合

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

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

例子:使用适配器模式将旧系统的接口转换为新系统的接口

#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;
}

 

From:https://www.cnblogs.com/best-doraemon/p/18309562
本文地址: http://www.shuzixingkong.net/article/154
0评论
提交 加载更多评论
其他文章 记一次 redis 事件注册不当导致的内存泄露
线上的程序跑着跑着内存越来越大,并且没有下降的趋势,重启一下程序也只能短暂恢复。通过 htop 命令再按一下 M 键按内存占用大小排个序,程序会占好几个G。那好,让我们来分析一下。
Java 网络编程(TCP编程 和 UDP编程)
1. Java 网络编程(TCP编程 和 UDP编程) @目录1. Java 网络编程(TCP编程 和 UDP编程)2. 网络编程的概念3. IP 地址3.1 IP地址相关的:域名与DNS4. 端口号(port)5. 通信协议5.1 通信协议相关的:OSI 参考模型5.2 通信协议相关的:TCP /
Java 网络编程(TCP编程 和 UDP编程) Java 网络编程(TCP编程 和 UDP编程) Java 网络编程(TCP编程 和 UDP编程)
吐血整理如何在Google Earth Engine上写循环 五个代码实例详细拆解
在这里同步一篇本人的原创文章。原文发布于2023年发布在知乎专栏,转移过来时略有修改。全文共计3万余字,希望帮助到GEE小白快速进阶。 引言 这篇文章主要解答GEE中.map()和.iterate()函数的用法。 首先解答一个疑问,为什么需要自己写循环?确实,GEE 为各种数据类型提供了无数常用的内
吐血整理如何在Google Earth Engine上写循环 五个代码实例详细拆解 吐血整理如何在Google Earth Engine上写循环 五个代码实例详细拆解 吐血整理如何在Google Earth Engine上写循环 五个代码实例详细拆解
C# 使用模式匹配的好处,因为好用所以推荐~
类型检查和转换:当你需要检查对象是否为特定类型,并且希望在同一时间内将其转换为那个类型时,模式匹配提供了一种更简洁的方式来完成这一任务,避免了使用传统的as和is操作符后还需要进行额外的null检查。 复杂条件逻辑:在处理复杂的条件逻辑时,特别是涉及到多个条件和类型的情况下,使用模式匹配可以使代码更
WPF/C#:实现导航功能
前言 在WPF中使用导航功能可以使用Frame控件,这是比较基础的一种方法。前几天分享了wpfui中NavigationView的基本用法,但是如果真正在项目中使用起来,基础的用法是无法满足的。今天通过wpfui中的mvvm例子来说明在wpfui中如何通过依赖注入与MVVM模式使用导航功能。实践起来
WPF/C#:实现导航功能 WPF/C#:实现导航功能 WPF/C#:实现导航功能
强烈推荐:18.3k star,推荐一款简单易用的HTTP请求流量录制回放工具:Goreplay
在软件开发和测试过程中,我们经常需要对应用程序的网络请求进行录制和回放,以便进行性能分析、压力测试或者模拟复杂的网络环境。今天,我要向大家推荐一款简单易用的 HTTP 请求流量录制回放工具:Goreplay。 1、简介 Goreplay 是一款用 Go 语言编写的 HTTP 请求流量录制回放工具。它
强烈推荐:18.3k star,推荐一款简单易用的HTTP请求流量录制回放工具:Goreplay 强烈推荐:18.3k star,推荐一款简单易用的HTTP请求流量录制回放工具:Goreplay
ComfyUI进阶:Comfyroll插件 (三)
前言: 学习ComfyUI是一场持久战,而Comfyroll 是一款功能强大的自定义节点集合,专为 ComfyUI 用户打造,旨在提供更加丰富和专业的图像生成与编辑工具。借助这些节点,用户可以在静态图像的精细调整和动态动画的复杂构建方面进行深入探索。Comfyroll 的节点设计简洁易用,功能强大,
ComfyUI进阶:Comfyroll插件 (三) ComfyUI进阶:Comfyroll插件 (三) ComfyUI进阶:Comfyroll插件 (三)
WPF使用AppBar实现窗口停靠,适配缩放、全屏响应和多窗口并列(附封装好即开即用的附加属性)
在吕毅大佬的文章中已经详细介绍了什么是AppBar:&#160;WPF 使用 AppBar 将窗口停靠在桌面上,让其他程序不占用此窗口的空间(附我封装的附加属性) - walterlv 即让窗口固定在屏幕某一边,并且保证其他窗口最大化后不会覆盖AppBar占据区域(类似于Windows任务栏)。 但
WPF使用AppBar实现窗口停靠,适配缩放、全屏响应和多窗口并列(附封装好即开即用的附加属性) WPF使用AppBar实现窗口停靠,适配缩放、全屏响应和多窗口并列(附封装好即开即用的附加属性) WPF使用AppBar实现窗口停靠,适配缩放、全屏响应和多窗口并列(附封装好即开即用的附加属性)