结构型 适配器模式

简介: 结构型 适配器模式

适配器模式(Adapter Pattern):将一个类的接口转换成客户希望的另外一个接口,两个不兼容的接口之间的桥梁。(改变目标对象的接口了)

适配器模式

增加一个中间接口,对目标接口和使用接口做一定的适配。

例如:18V的接口,通过适配器实际调成220V

使用场景:

一般使用在遗留代码的系统中。

适配遗留代码和现在代码。

参考:C++实现设计模式——适配器(Adapter)模式_yxh_1_的博客-CSDN博客_c++ 适配器

代码demo:

如:把220v的电压适配到不同的电压去使用:

#include <iostream>
#include <string.h>
using namespace std;
//适配器的作用,使我们要用的接口满足目标使用接口
//例如:我们的电压通常使220v,但实际产品,有18v,22v等各种不同的电压,我们在用的时候,需要把220v通过适配转成满足的目标产品要求
//定义我们的220v电压接口 
class Current220v{
public:
  //基本的业务接口,如充电,放电等
  void charge(int i) {//相关业务等
    cout<<"use "<<i <<" v !"<<endl; 
  } 
};
//定义一个适配器,把220v的电压适配成不同的电压, 类似变压器的功能
class Adapter : public Current220v
{
  //适配 变成不同的电压接口
public:
  void use18v() {
    Current220v::charge(18);//这里其实使相关的业务,调用基类的业务接口,设置参数,调用基类接口
  }
  void use22v(){
    Current220v::charge(22);
  }
  void use220v(){
    Current220v::charge(220);
  }
  void useOtherV(){
    cout<<"use other v"<<endl;
  }
};
//定义一个基类,供使用的其他产品使用   使用客户提供的统一接口
class baseProduct{
public:
  baseProduct() {
    ad = new Adapter();
  }
  virtual ~baseProduct(){
    if(ad != nullptr)
    {
      delete ad;
      ad = nullptr;
    }
  }
public:
  virtual void use_voltage() = 0;
  Adapter * getAdaptor() { return ad;}
private:
  Adapter * ad;
};
//不同的产品 18v的产品
class useCurrent18v:public baseProduct
{
public:
    void use_voltage() override
    {
        baseProduct::getAdaptor()->use18v();
    }
};
//不同的产品 18v的产品
class useCurrent22v:public baseProduct
{
public:
    void use_voltage() override
    {
        baseProduct::getAdaptor()->use22v();
    }
};
//不同的产品 220v的产品
class useCurrent220v:public baseProduct
{
public:
    void use_voltage() override
    {
        baseProduct::getAdaptor()->use220v();
    }
};
void testuse18v(){
  useCurrent18v * use_18v = new useCurrent18v();
  use_18v->use_voltage();
  delete use_18v;
  use_18v = nullptr;
}
void testuse22v(){
  useCurrent22v * use_22v = new useCurrent22v();
  use_22v->use_voltage();
  delete use_22v;
  use_22v = nullptr;
}
void testuse220v(){
  useCurrent220v * use_220v = new useCurrent220v();
  use_220v->use_voltage();
  delete use_220v;
  use_220v = nullptr;
}
int main()
{
  //当不同的产品使用时 直接定义类,使用适配器统一接口
  testuse18v();
  testuse22v();
  testuse220v();
    return 0;
}

用不同的类型去使用适配不同的接口,或者而用虚基类来调用

#include <iostream>
#include <string.h>
using namespace std;
//适配器模式
//可以作为升级api,升级版本接口使用
//参考网址:https://blog.csdn.net/yxh_1_/article/details/116085949
//1:可以通过版本类型决定,适配器选择的版本的接口,感觉类似于桥接了
//2:可以通过继承的方式,使用最新的接口
enum VersionType{
    VersionOne,
    VersionTwo,
    VersionThree
};
class old_one_api{
    void use_api()
    {
        cout<<" one version api"<<endl;
    }
};
class old_two_api{
    void use_api()
    {
        cout<<" two version api"<<endl;
    }
};
class old_three_api{
    void use_api()
    {
        cout<<" three version api"<<endl;
    }
};
class adapter : public old_one_api, public old_two_api, public old_three_api
{
public:
    void use_version_api_by_type()
    {
        switch(m_type)
        {
            case VersionOne: old_one_api::use_api(); break;
            case VersionTwo: old_two_api::use_api(); break;
            case VersionThree: old_three_api::use_api(); break;
        }
        return;
    }
    void set_version_type(VersionType type)
    {
        m_type = type;
    }
public:
    VersionType m_type;
};
int main()
{
    //通过适配器 分别使用不同的版本
    adapter * ad = new adapter();
    //使用第一个版本:
    ad->set_version_type(VersionOne);
    ad->use_version_api_by_type();
    //使用第儿个版本:
    ad->set_version_type(VersionTwo);
    ad->use_version_api_by_type();
    //使用第三个版本:
    ad->set_version_type(VersionThree);
    ad->use_version_api_by_type();
    delete ad;
    return 0;
}
目录
相关文章
|
Java
java 设计BaseDao
java 设计BaseDao
107 0
|
计算机视觉 Python
yolov5+deepsort目标检测与跟踪(毕业设计+代码)
yolov5+deepsort目标检测与跟踪(毕业设计+代码)
|
12月前
|
数据可视化 数据挖掘 BI
Quick BI 使用体验报告
Quick BI 使用体验报告
286 3
|
Java
Java强制类型转换需要注意的点
在 Java 中,强制类型转换(显式类型转换)用于将一种数据类型转换为另一种。然而,这一过程需谨慎处理以避免以下问题:数据丢失,尤其是在从大范围类型转换到小范围类型时;类型不兼容,如 `String` 无法直接转换为 `int`;对象类型转换时应确认实际类型与目标类型兼容,可借助 `instanceof` 运算符;处理基本类型与包装类之间的自动装箱和拆箱时需注意 `null` 值;浮点数转整数时会截断小数部分;字符转整数则得到 Unicode 值。充分理解这些注意事项有助于避免运行时错误和数据不一致。
536 16
|
数据采集 JavaScript 测试技术
Python爬虫通过selenium自动化抓取淘宝的商品数据
淘宝的页面大量使用了js加载数据,所以采用selenium来进行爬取更为简单,selenum作为一个测试工具,主要配合无窗口浏览器phantomjs来使用。
1293 0
|
存储 Java 对象存储
2022年Servlect课时十七——什么是监听器@@回顾过滤器@@Servlect(一)
2022年Servlect课时十七——什么是监听器@@回顾过滤器@@Servlect(一)
132 0
|
存储 NoSQL 关系型数据库
(二)漫谈分布式之理论篇:用刁钻的手法掰正你那学歪的CAP与BASE理论!
大多数讲分布式的资料、课程,虽然在一开始就会先讲述CAP理论,但大家仔细想想,你在做分布式项目时,落地过这个基础理论吗?相信包括我在内,以及90%以上的开发者,没有,至于为何,本文来从不一样的角度好好唠唠CAP,以及另一个著名的BASE理论~
415 0
|
算法 JavaScript 前端开发
JavaScript学习 -- HMAC算法基本原理
JavaScript学习 -- HMAC算法基本原理
527 0
|
存储 对象存储
R语言分布滞后线性和非线性模型(DLNM)分析空气污染(臭氧)、温度对死亡率时间序列数据的影响
R语言分布滞后线性和非线性模型(DLNM)分析空气污染(臭氧)、温度对死亡率时间序列数据的影响
|
数据采集 机器学习/深度学习 人工智能
用人工智能和missForest构建完美预测模型,数据插补轻松驾驭
用人工智能和missForest构建完美预测模型,数据插补轻松驾驭
708 1