首页 > 其他分享 >设计模式之适配器模式(学习笔记)

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

时间:2024-07-18 15:08:09浏览次数:10  
标签:std const 适配器 接口 笔记 日志 设计模式 oldLogger

定义 

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

为什么使用适配器模式

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

 

标签:std,const,适配器,接口,笔记,日志,设计模式,oldLogger
From: https://www.cnblogs.com/best-doraemon/p/18309562

相关文章

  • 吴恩达深度学习课程笔记Lesson03
    第三周:浅层神经网络(Shallowneuralnetworks)文章目录第三周:浅层神经网络(Shallowneuralnetworks)3.1神经网络概述(NeuralNetworkOverview)3.2神经网络的表示(NeuralNetworkRepresentation)3.3计算一个神经网络的输出(ComputingaNeuralNetwork'soutput)3.4多样......
  • xxe学习笔记
    什么是xxeXXE(XMLExternalEntityInjection)全称为XML外部实体注入,由于程序在解析输入的XML数据时,解析了攻击者伪造的外部实体而产生的。例如PHP中的simplexml_load默认情况下会解析外部实体,有XXE漏洞的标志性函数为simplexml_load_string()。当允许引用外部实体时,通过构造恶......
  • java23种设计模式!附源码
            本文将详细介绍Java中常见的23种设计模式、应用场景、优缺点、代码示例。包括单例模式、工厂模式、建造者模式、原型模式、适配器模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式、代理模式、职责链模式、状态模式、策略模式、模板方法模式、观察者......
  • python笔记:赋值,浅拷贝和深拷贝
    在Python中,变量赋值、浅拷贝和深拷贝在处理对象时有不同的行为和应用场景。以下是它们的详细区别:1.赋值赋值操作只是创建了一个新的引用(别名)来指向同一个对象。也就是说,赋值操作并不创建新的对象,原始对象和赋值后的变量指向同一块内存区域。a=[1,2,3]b=a#b是a......
  • Spring与设计模式实战之策略模式
    Spring与设计模式实战之策略模式引言在现代软件开发中,设计模式是解决常见设计问题的有效工具。它们提供了经过验证的解决方案,帮助开发人员构建灵活、可扩展和可维护的系统。本文将探讨策略模式在Spring框架中的应用,并通过实际例子展示如何通过Spring的特性来实现和管理策......
  • PointNet笔记
    可能遇到的问题在windows上运行pointnet的代码时,可能会遇到一些问题:1.比如提示OSError:nofilewithexpectedextension,这是因为可视化的show3d_balls.py文件运行不了,具体的解决方法可以看这篇文章:https://blog.51cto.com/u_16213693/7738038。2.由于作者的pointnet所用的p......
  • Halcon的学习笔记(一)——非线性字符识别
    Halcon非线性模式的字符识别(ocr_cd_print_polar_trans.hdev例程分析)Halcon的学习笔记(一)——非线性字符识别项目上需要对非线性模式的字符进行识别,halcon中包含的例程,我搜了一下,网上对于该例程的解析比较少,因此自己便记录了一下自己的学习例程,也算自己的学习笔记。1.什......
  • 设计模式-领域逻辑模式-事务脚本(Transaction Script)
    事务脚本的特点多数应用可看成由多个事务组成事务脚本将多个业务逻辑组织成单个过程事务间相互修改各自产生的数据事务脚本的运行机制    使用事务脚本时,领域逻辑主要通过系统所执行的事务来组织。例如:预定酒店过程。事务脚本的组织将整个事务脚本放在一个类里每......
  • 笔记本误克隆病毒破坏装系统分区误删电脑数据
    针对笔记本误克隆病毒导致系统分区被破坏以及误删电脑数据的情况,以下是一些建议的恢复步骤和预防措施:一、数据恢复步骤1.立即停止使用电脑:1.一旦发现数据丢失或系统异常,应立即停止使用该笔记本,避免对硬盘进行进一步写入操作,以防止数据被覆盖,增加恢复难度。2.使用数据恢复软件:......
  • 设计模式:真正的建造者模式
    又臭又长的set方法经常进行Java项目开发使用各类starter的你一定见过这种代码:publicclassSwaggerConfig{@BeanpublicDocketapi(){returnnewDocket(DocumentationType.SWAGGER_2).select().apis(RequestHandler......