设计模式-适配器-笔记

适配器模式Adapter

动机(Motivation)

在软件系统中,由于应用环境的变化,常常需要将"一些现存的对象"放在新的环境中应用,但是新环境要求的接口是在这些现存对象所不满足的。

如何应对这种"迁移的变化"?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?

模式定义

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

要点总结

Adapter模式主要应用于"希望复用一些现存的类",但是接口又与复用环境要求不一致的情况,在遗留代码复用、类库迁移等方面非常有用。

GoF23定义了两种Adapter模式的实现结构:对象适配器和类适配器。但类适配器采用"多继承"的实现方式,一般不推荐使用。对象适配器采用"对象组合"的方式,更符合松耦合精神。

Adapter模式可以实现的非常灵活,不必拘于Gof23中定义的两种接口。例如,完全可以将Adapter模式中的"现存对象"作为新的接口方式参数,来达到适配的目的。

示例:

cpp 复制代码
// 目标接口(新接口)
class ITarget {
public:
    virtual void process() = 0;
};

//遗留接口(老接口)
class IAdaptee {
public:
    virtual void foo(int data) = 0;
    virtual int bar() = 0;
};

//遗留类型
class OldClass : public IAdaptee {
public:
    virtual void foo(int data) {
        //...
    }

    virtual int bar() {
        //...
    }
};

//对象适配器
class Adapter : public ITarget {
protected:
    IAdaptee* p_adaptee_;

public:

    Adapter(IAdaptee* adaptee)
        : p_adaptee_(adaptee)
    {}

    virtual void process() {
        int data = p_adaptee_->bar();
        p_adaptee_->foo(data);
    }
};

int main() {
    IAdaptee* pAdaptee = new OldClass();

    ITarget* pTarget = new Adapter(pAdaptee);
    pTarget->process();
}
相关推荐
六点_dn8 小时前
RabbitMQ学习笔记-部署和使用
笔记·学习·rabbitmq
2501_926978339 小时前
以说明书 DNA 为模板——完整 AGI 的结构图景
前端·人工智能·经验分享·笔记·ai写作
天天爱吃肉82189 小时前
商用车多体动力学实战笔记|第6篇:动力传动系统(发动机、变速箱、分动器、TCS、LSD限滑差速)
大数据·人工智能·笔记·python·嵌入式硬件·汽车
IT199510 小时前
Dify 实战笔记:工作流核心玩法 + 开源 AI 应用全解析
笔记
dong13269710 小时前
Agent Skills学习笔记
笔记·学习
摇滚侠12 小时前
《SpringBoot 3:入门与应用实战》第 15 章 生产级特性 管理 Spring Boot 应用 阅读笔记
java·spring boot·笔记
liferecords12 小时前
阅读笔记:ExtractBench: A Benchmark for Schema-Guided Enterprise Document Extraction
笔记
尤乐娃子13 小时前
进入大厂(厂子大)实习Day8
前端·笔记·实习
一只小菜鸡..13 小时前
南京大学 操作系统 (JYY) 学习笔记:持久化的黑魔法——从磁铁、刻坑到闪存电荷
服务器·笔记·学习
aFakeProgramer13 小时前
Linux版本兼容问题及RTA-VRTE环境配置笔记
linux·笔记