设计模式——适配器模式

适配器模式,是一种结构型设计模式,关键就是适配。举一个常见的例子。现在的大部分手机都是typec接口,但是依然有很多用户的安卓手机是旧的USB接口,想要匹配用户的需求就需要一个转接头(适配器),然后才能更好的匹配用户的需求。

可能有人会问,为啥不能干脆换一个typec的充电线就可以了,实际操作确实可以,但是在软件开发领域我们都知道开闭原则。如果直接换数据线就好比直接修改老代码,这样不仅会丢掉原来的功能,还可能会接口不协调影响整体,所以加一个转接头(适配器)更安全也更合理。

这样,就可以分我以下几个基本角色:

  • 目标接口Target:客户端希望使用的接口;
  • 适配器类Adapter:实现客户端目标接口,持有一个需要适配的类实例
  • 被适配者Adaptee:需要被适配的类

这样,客户端就可以使用目标接口而不要对原来的Adaptee进行修改,Adapter起到一个转接拓展的功能。

基本实现

cpp 复制代码
#include<bits/stdc++.h>
// 目标接口
class Target {

    public:

    virtual ~Target() = default;

    virtual std::string Request() const {

        return "Target: The default target's behevior.";

    }

  

};

  
  

// 被适配类

class Adaptee {

    public:

    std::string SpecificRequest() const {

        return ".eetpadA eht fo roivaheb laiceps";

    }

  

};


  

// 适配器类

class Adapter :public Target, public Adaptee {

    public:

    Adapter() {}

    std::string Request() const {

        std::string to_reverse = SpecificRequest();

        std::reverse(to_reverse.begin(), to_reverse.end());

        return "Adapter:(TRANSLATED) " + to_reverse;

    }

};

  
  

// 客户端类

void ClientCode(const Target* target) {

    std::cout << target->Request() << std::endl;

}

  

int main() {

    using namespace std;

    cout << "Client: I can work just fine with the Target object:\n";

    Target* target = new Target;

    ClientCode(target);

    cout << endl;

  

    Adaptee* adaptee = new Adaptee;

    cout << "Client : The Adaptee class has a weird interface.\n";

    cout << "Adaptee: " << adaptee->SpecificRequest() << endl;

    cout << endl;

    cout << "Client :But I can work with it via the Adapter:\n";

    Adapter* adapter = new Adapter;

    ClientCode(adapter);

    delete target;

    delete adaptee;

    delete adapter;

 
    return 0;

}

输出:

复制代码
Client: I can work just fine with the Target object:
Target: The default target's behevior.

Client : The Adaptee class has a weird interface.
Adaptee: .eetpadA eht fo roivaheb laiceps

Client :But I can work with it via the Adapter:
Adapter:(TRANSLATED) special behavior of the Adaptee.

如图所示,适配器类的主要目的就是将被适配类的对象就行转换,这里是做了最简单的反转操作,然后返回给客户端。可以到这里使用了C++的双重继承属性实现起来比较方便。否则适配器就只能继承目标类,然后在其中定义一个被适配者实例,再调用其方法。

实际开发过程上,适配器模式往往扮演一个"补救"和"拓展"的角色:

  • 当使用一个已经存在的类,但是他的接口与你的代码不兼容时,可以使用适配器模式
  • 当系统扩展阶段需要增加新的类时,并且类的接口和系统现有的类不一致时,可以使用。

使用适配器模式可以将客户端代码与具体的类解耦,客户端不需要知道被适配者的细节,客户端代码也不需要修改,这使得他具有良好的拓展性,但是这也势必导致系统的复杂性。

相关推荐
爱编程的化学家3 分钟前
代码随想录算法训练营第六天 - 哈希表2 || 454.四数相加II / 383.赎金信 / 15.三数之和 / 18.四数之和
数据结构·c++·算法·leetcode·双指针·哈希
许怀楠2 小时前
【主页介绍】
linux·c++·贪心算法·visual studio
木心爱编程4 小时前
C++链表实战:STL与手动实现详解
开发语言·c++·链表
离越词4 小时前
QTday1作业
c++·qt
HAH-HAH5 小时前
【蓝桥杯 2024 国 Java A】粉刷匠小蓝
c++·学习·数学·算法·职场和发展·蓝桥杯·组合数学
小吴同学·6 小时前
OPC Client第10讲:实现主界面;获取初始界面传来的所有配置信息config【C++读写Excel:xlnx;ODBC;缓冲区】
c++·wxwidgets
边疆.6 小时前
【C++】继承详解
开发语言·c++·继承
hweiyu007 小时前
C++设计模式,高级开发,算法原理实战,系统设计与实战(视频教程)
c++·算法·设计模式
十年编程老舅7 小时前
‌C++左值与右值:从基础概念到核心应用‌
linux·c++·右值引用·c++17·c++左值·c++右值·左值引用
John_ToDebug7 小时前
Chrome性能黑魔法:深入浅出PGO优化与实战指南
c++·chrome