当前位置: 首页 > article >正文

设计模式-适配器-笔记

适配器模式Adapter

动机(Motivation)

在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是在这些现存对象所不满足的。
如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?

模式定义

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

要点总结

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

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

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

示例:

// 目标接口(新接口)
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();
}


http://www.kler.cn/a/133998.html

相关文章:

  • FluentUI使用
  • 微信小程序的主体文件和页面文件介绍
  • 前端开发中常用的包管理器(npm、yarn、pnpm、bower、parcel)
  • 前端神经网络入门(三):深度学习与机器学习的关系、区别及核心理论支撑 - 以Brain.js示例
  • Scala入门基础(17.1)Set集习题
  • 网络远程操控
  • 算法之路(二)
  • 【NI-DAQmx入门】校准
  • 05 robotFrameWork+selenium2library 一维数组的使用
  • Nodejs 第十九章(pngquant)
  • HTTP Error 500.31 - Failed to load ASP.NET Core runtime
  • 企业微信H5开发遇到的坑
  • vue3 tsx 项目中使用 Antv/G2 实现多线折线图
  • Python操控HDFS
  • struct结构体【C#】
  • Mac M1 M1 pro安装 protobuf 2.5.0
  • vue中使用echarts实现省市地图绘制,根据数据显示不同区域颜色,点击省市切换,根据经纬度打点
  • 【VSCode】Visual Studio Code 配置简体中文环境教程
  • 10个提高VS Code工作效率的技巧
  • 【Linux网络】典型NAS存储方式:NFS网络共享存储服务
  • Android跨进程通信,IPC,RPC,Binder系统,C语言应用层调用
  • 批量替换WordPress文章内图片链接
  • vue3.0中实现excel文件的预览
  • 07-流媒体-RTMP推流
  • 实战项目:VB龟兔赛跑游戏+猜数字游戏
  • vue3安装vue-router