本文共916个字,预计阅读时间需要3分钟。

简介

适配器模式:将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作

适配器模式的别名为包装器(Wrapper)模式,它既可以作为类结构型模式,也可以作为对象结构型模式。在适配器模式定义中所提及的接口是指广义的接口,它可以表示一个方法或者方法的集合。

结构:

客户端使用的Target类需要使用一个已经存在的接口Adaptee类,可以用两种方法实现:
1、构造Adapter类继承Target类,并实现Adaptee接口(适配器模式的类版本)
2、将一个Adaptee实例作为Adapter的组成部分(适配器模式的对象版本)
类适配器模式结构图:

对象适配器结构图:

适配器模式的适用性:

想使用一个已经存在的类,但它的接口不符合需求。
想创建一个可以复用的类,该类可以与其它不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。

实例

分别利用类版本和对象版本的适配器模式模拟实现ps2接口和usb接口的转换。

我们手中有个ps2插头的设备,但是主机上只有usb插头的接口,实现一个适配器将ps2接口转换为usb接口。其中,ps2接口表示为:

class Ps2{virtual void isPs2();
}class Usb{Virtual void isusb();
}。

实验UML图

代码

target为:usb
Adaptee为:Ps2
Adapter类公有继承target,私有继承Adaptee

类适配器模式代码
#include<iostream>
using namespace std;/*
分别利用类版本和对象版本的适配器模式模拟实现ps2接口和usb接口的转换。
我们手中有个ps2插头的设备,但是主机上只有usb插头的接口,实现一个适配器将ps2接口转换为usb接口。其中,ps2接口表示为:
class Ps2{virtual void isPs2();
}
Usb接口表示为:
class Usb{Virtual void isusb();
}。
*/class Usb{ //target
public:virtual void isusb(){cout<<"USB接口"<<endl;};
};class Ps2{ //adaptee
public:void isPs2(){cout<<"Ps2"<<endl;};
};class Adapter: public Usb, private Ps2{void isusb(){isPs2();}
};int main(){Usb* usb = new Adapter();usb->isusb();return 0;
}
对象适配器代码
#include<iostream>using namespace std;class Ps2{ //adaptee
public:void isPs2(){cout<<"Ps2"<<endl;};
};class Usb{ //target
public:virtual void isusb(){cout<<"USB接口"<<endl;};
};class Adapter: public Usb{public:void isusb(){ps2->isPs2();}
private:Ps2 * ps2 = new Ps2();
};int main(){Usb* usb = new Adapter();usb->isusb();return 0;
}

两个均调用的为SpecificRequest();

总结

①本次实验掌握并编码了适配器模式的类与对象的两种不同方法。

②在实现类适配器和对象适配器时,注意,对象适配器模式中的“目标接口”和“适配者类”的代码同类适配器模式一样,只要修改适配器类和客户端的代码即可。

更多内容访问 omegaxyz.com
网站所有代码采用Apache 2.0授权
网站文章采用知识共享许可协议BY-NC-SA4.0授权
© 2019 • OmegaXYZ-版权所有 转载请注明出处

适配器模式C++实现相关推荐

  1. 简书php硬件交互,php设计模式——适配器模式

    适配器模式 适配器模式(Adapter)模式:将一个类的接口,转换成客户期望的另一个类的接口.适配器让原本接口不兼容的类可以合作无间.列如:将数据库接口封装成一样的接口, 这样就可以适用于不同场景 案 ...

  2. 设计模式之适配器模式(Adapter)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  3. 给女友讲讲设计模式——适配器模式(JAVA实例)5

    前言 有这样一个人,看到别人一个个开餐馆赚了好多钱,于是自己也很想在餐饮业这方面大展拳脚,他从别人那里学到了他们的理念,还学习到了他们真正开店的经验.不但如此,他还引进了除了吃饭意外其他的服务,例如说 ...

  4. java设计模式-适配器模式

    模式导读:    每个人都有自己不同的需要,每个人都有自己能够接受的不同方式,就像是为满足现在快速度发展的社会,几乎人人离不开手机的时代,我们也许会碰到在外出行手机电量不足的情况,这个时候如果你在车站 ...

  5. 设计模式——6适配器模式(Adapter)

    6.适配器模式(Adapter) 适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题.主要分为三类:类的适配器模式.对象的适配器模式.接口的适配器 ...

  6. C#设计模式(7)——适配器模式(Adapter Pattern)

    一.引言 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将"将现存的对象" ...

  7. Python设计模式-适配器模式

    Python设计模式-适配器模式 基于Python3.5.2,代码如下 #coding:utf-8class ACpnStaff:name = ""id = "" ...

  8. 步步为营 .NET 设计模式学习笔记 六、Adapter(适配器模式)

    概述 在软件系统中,由于应用环境的变化,常常需要将"一些现存的对象"放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的.那么如何应对这种"迁移的变化&quo ...

  9. [Head First设计模式]身边的设计模式——适配器模式

    系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式- ...

  10. 简述事件接口与事件适配器的联系与区别_设计模式——适配器模式

    适配器模式 适配器模式(Adapter Pattern):将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper).适配器模式既可以作为类结构型模式,也 ...

最新文章

  1. Pat乙级 1038 统计同成绩学生
  2. 利用nodeJs anywhere搭建本地服务器环境
  3. NYOJ 625 笨蛋的难题(二)
  4. Kubernetes Ingress 高可靠部署最佳实践
  5. 上海理工大学:用数字技术打响智慧抗疫信息战
  6. 让自己强大,必须放下十样东西
  7. keras下的线性回归实例
  8. ni max不能连续采集图像_1.6视觉检测项目过程分解——程序的连续运行
  9. JaveScript简单数据类型(JS知识点归纳二)
  10. 如何使用NFC双界面读写器UTrust4701读取电子护照信息
  11. 如何备份光猫html文件夹,华为光猫备份jffs2及HG8321R-RMS切换HG8321版本教程
  12. iphone手机 ios系统 无法更新app 跳转到AppStore 显示 打开
  13. 笔记本电脑插耳机后耳机无声音有外放情况,咋办??
  14. 转载:全志问题解决方法
  15. 企业微信应用开发(JS-SDK网页式开发)第一集:创建应用以及配置可信域名
  16. 没有目标的人叫流浪,有目标的人叫航行
  17. 嵌入式linux ARM 开发板 使用pyqt显示界面
  18. AUTOSAR的一般开发流程(单个ECU)
  19. 字符串转化为Json
  20. Linux查看系统信息命令总结

热门文章

  1. snprintf与sprintf的区别
  2. 大学使用python 编辑器_Python数据分析|最多人用的代码编辑器推荐
  3. can接收id过滤linux,linux – 很大程度上被candump(SocketCAN)ID过滤功能搞糊涂了
  4. seata 使用oracle_使用Seata彻底解决Spring Cloud中的分布式事务问题!
  5. react 点击使父元素消失_在 React 组件中使用 Refs 指南
  6. 北方民族大学c语言期末考试试题,2018年北方民族大学软件工程832C语言程序设计与数据结构之C程序设计考研核心题库...
  7. ElementUI:dialog的遮罩层在弹出层的上面
  8. gifrecord可以卸载吗_频繁安装卸载 App,手机真能受得了吗?!
  9. await js 报错_async/await优雅的错误处理方法总结
  10. oracle报错12516,Oracle连接数太多报错-ORA-12516异常