美文网首页
S14. 适配器模式

S14. 适配器模式

作者: 拂去尘世尘 | 来源:发表于2022-03-19 10:18 被阅读0次

适配器模式

适配器模式是一种结构型设计模式, 它能使接口不兼容的对象能够相互合作。

适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本不兼容的接口一起工作。

意义

在于将某些功能与第三方需求接口适配对接,且避免第三方接口与功能代码过多耦合。

在设计初初,不要考虑使用此模式。仅在功能完善,需要实现第三方接口时,没必要迎合第三方的需求对原来的设计大动刀戈,可以尝试使用适配器模式。

多用于想应用某些功能,但是功能类的接口与需求的接口不兼容时,采用适配器模式来解决。主要应用在以下场景:

  • 新旧接口兼容
    软件版本升级,部分旧接口还在被使用。需要保留旧的接口,增加新接口,使两者兼容。
  • 第三方接口的适配
    在系统功能稳定的情况下,有第三方新的接口需求需要对接。
  • 统一多个类相同功能的接口
    例如统一不同类型数据库的访问接口。

应用场景

实现TypeC接口手机连通USB接口的U盘。

分析

手机可插入的接口为TypeC或其他非USB接口,但U盘为USB接口,与需求接口不符。因此,可通过适配器完成USB与TypeC的对接。

USB转TypeC

在实现此适配器后,就能完成U盘连接手机工作。


U盘连接手机

类图

适配器模式有两种实现方法,类适配器和对象适配器。
类适配器
以多继承方式实现。

类适配器
  • Target: 客户端期望接口类
  • Adaptee: 实际需要的功能类
  • Adapter: 将接口类与功能类衔接的适配器类
  • Client: 客户端代码

对象适配器
在适配器类中,包装适配者(Adaptee)接口。

类适配器
  • Target: 客户端期望接口类
  • Adaptee: 实际需要的功能类
  • Adapter: 将接口类与功能类衔接的适配器类
  • Client: 客户端代码

从类图上可以看出两者的差异,类适配器采用多继承方式,对象适配器采用对适配者Adaptee接口方式。两种方式都能完成Target接口与Adaptee接口对接。

源码实现

编程环境

  1. 编译环境: Linux环境
  2. 语言: C++语言
  3. 编译命令: make

工程结构

Adapter/
├── ClassAdapter
│   ├── adapter.cc
│   └── Makefile
└── ObjectAdapter
    ├── adapter.cc
    └── Makefile
  • ClassAdapter: 类适配器目录
  • ObjectAdapter: 对象适配器目录
  • Makefile: 编译工具

类适配器方式

/* Connect Usb port */
class CUsbDisk
{
public:
    virtual ~CUsbDisk() {}

    virtual void ConnectDevice()
    {
        cout << "Connect usb port." << endl;
    }
};

/* Connect Type-C port */
class CTypeCInterface
{
public:
    virtual ~CTypeCInterface() {}

    void ConnectDevice()
    {
        cout << "Connect Type-C port." << endl;
    }
};

/* Not only connect Usb port, but also connect Type-C port */
class CAdapter : public CUsbDisk, public CTypeCInterface
{
public:
    void ConnectDevice()
    {
        CTypeCInterface::ConnectDevice();
    }
};

int main(int argc, char *argv[])
{
    CUsbDisk *theDisk = new CAdapter();

    theDisk->ConnectDevice();

    delete theDisk;
    return 0;
}

对象适配器方式

/* Connect Usb port */
class CUsbDisk
{
public:
    virtual ~CUsbDisk() {}

    virtual void ConnectDevice()
    {
        cout << "Connect usb port." << endl;
    }
};

/* Connect Type-C port */
class CTypeCInterface
{
public:
    virtual ~CTypeCInterface() {}

    void ConnectDevice()
    {
        cout << "Connect Type-C port." << endl;
    }
};

/* Usb device connect phone */
class CAdapter : public CUsbDisk
{
public:
    CAdapter()
    {
        mpAdaptee = new CTypeCInterface();
    }

    ~CAdapter()
    {
        if (NULL != mpAdaptee) {
            delete mpAdaptee;
        }
    }

    void ConnectDevice()
    {
        if (NULL != mpAdaptee) {
            mpAdaptee->ConnectDevice();
        } else {
            cout << "Adapter abnormal. Connect fail!" << endl;
        }
    }

private:
    CTypeCInterface *mpAdaptee;
};


int main(int argc, char *argv[])
{
    CUsbDisk *theDisk = new CAdapter();

    theDisk->ConnectDevice();

    delete theDisk;
    return 0;
}

注意到两种实现方式中,客户端main中的代码都是一致的。说明两种实现方法对于客户来说是无需关心的。

测试效果

类适配器方式

./exe
Connect Type-C port.

对象适配器方式

./exe 
Connect Type-C port.

两者执行结果一致,说明效果相同,实现方式可相互替换。

总结

  • 适配器模式主要原理: 在于实现客户接口时,关联上已存在的功能接口。一种使用过多继承方式,一种通过类之间依赖的方式,都能实现。
  • 为统一多个功能相同的类接口时,类适配器模式是更适合的。比较典型的例子如,MySql和SQLServer等多种类型数据库的访问接口的统一。
  • 《Effective C++》曾告诫程序猿们: C++编程不要轻易使用多继承,除非忍不住!
  • 另外,文中也有说过。在软件开发初,无第三方需求接口的情况下,不要考虑此模式的使用。往往适配器模式的使用,会让代码看起来像一个补丁,修修补补。
  • 适配器模式看起来与外观模式相似,都是与外部对接。其实有很大不同: 外观模式是定义一套新的接口,而适配器模式则是运用已有的接口。外观模式是在已有复杂的接口上,再封一层简单的接口,方便客户端使用。适配器模式则是结合已有的功能,实现或重载已经存在的客户端接口。

相关文章

  • S14. 适配器模式

    适配器模式 适配器模式是一种结构型设计模式, 它能使接口不兼容的对象能够相互合作。 适配器模式将一个类的接口转换成...

  • Java设计模式(二)

    talk is cheap show me the code 适配器模式 类适配器模式 接口适配器模式 对象适配器...

  • 适配器模式

    目录 1、什么是适配器模式? 2、适配器模式结构? 3、如何实现适配器模式? 4、适配器模式的特点? 5、适配器模...

  • 设计模式之适配器模式

    适配器模式: 类适配器模式、对象适配器模式、接口适配器模式 1.类适配器模式:新的接口出现了,但是和老的接口不兼容...

  • 学习iOS设计模式第一章 适配器(Adapter)

    今天学习了iOS设计模式中的适配器模式,适配器有两种模式对象适配器模式-- 在这种适配器模式中,适配器容纳一个它包...

  • 第4章 结构型模式-适配器模式

    一、适配器模式简介 二、适配器模式的优点 三、适配器模式的实例

  • 设计模式(Design Patterns)适配器模式(Adapt

    适配器模式主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。 类的适配器模式 场景:将一个类转换成...

  • 适配器模式

    适配器模式主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。适配器模式将某个类的接口转换成客户端期...

  • 适配器模式

    先直观感受下什么叫适配器 适配器模式有类的适配器模式和对象的适配器模式两种不同的形式。 类适配器模式 对象适配器模...

  • 适配器模式

    适配器模式 一、适配器模式定义 适配器模式的定义是,Convert the interface of a clas...

网友评论

      本文标题:S14. 适配器模式

      本文链接:https://www.haomeiwen.com/subject/whygdrtx.html