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

该模式中有三种角色:

1、目标:是一个抽象类,它是客户想使用的接口

2、被适配者:被适配者是一个已经存在的抽象类或者是接口,需要被适配

3、适配器:适配器是一个类,它继承目标并包含有被适配者的引用。它的职责是将被适配者适配为目标

本例子中的三相电流是目标,现在有洗衣机,可以直接使用三相电流,电视机,可以使用两相电流,现在要将电视机适配为可以直接使用三相电流。实现如下:

(1)Target.h

  1. #ifndef _TARGET_H_
  2. #define _TARGET_H_
  3. #include <iostream>
  4. #include <string>
  5. using namespace std;
  6. //目标 (就是适配成这样的,都使用这种)
  7. class ThreeElectricOutlet{
  8. public:
  9. virtual void connectElectricCurrent() = ;
  10.  
  11. };
  12.  
  13. //被适配者 (现在不能使用它,把它适配为可以使用)
  14. class TwoElectricOutlet{
  15. public:
  16. virtual void connectElectricCurrent() = ;
  17. };
  18.  
  19. //适配器
  20. class ThreeElectricAdapter : public ThreeElectricOutlet{
  21. private:
  22. TwoElectricOutlet *myOutlet;
  23.  
  24. public:
  25. ThreeElectricAdapter(TwoElectricOutlet *outlet);
  26. void connectElectricCurrent() override;
  27. };
  28.  
  29. //具体目标
  30. class Wash : public ThreeElectricOutlet{
  31. public:
  32. Wash();
  33. Wash(string s);
  34. void connectElectricCurrent() override;
  35.  
  36. private:
  37. string name;
  38.  
  39. };
  40.  
  41. //具体被适配者
  42. class Tv : public TwoElectricOutlet{
  43. public:
  44. Tv();
  45. Tv(string s);
  46. void connectElectricCurrent() override;
  47. private:
  48. string name;
  49.  
  50. };
  51.  
  52. #endif

(2)Target.cpp

  1. #include "Target.h"
  2.  
  3. ThreeElectricAdapter::ThreeElectricAdapter(TwoElectricOutlet *outlet)
  4. {
  5. myOutlet = outlet;
  6. }
  7.  
  8. void ThreeElectricAdapter::connectElectricCurrent()
  9. {
  10. myOutlet->connectElectricCurrent();
  11. }
  12.  
  13. Wash::Wash()
  14. {
  15. name = "洗衣机";
  16. }
  17. Wash::Wash(string s)
  18. {
  19. name = s;
  20. }
  21.  
  22. void Wash::connectElectricCurrent()
  23. {
  24. cout << name << "begin wash" << endl;
  25. }
  26.  
  27. Tv::Tv()
  28. {
  29. name = "电视机";
  30. }
  31.  
  32. Tv::Tv(string s)
  33. {
  34. name = s;
  35. }
  36.  
  37. void Tv::connectElectricCurrent()
  38. {
  39. cout << name << "begin play video" << endl;
  40. }

(3)AdapterTest.cpp

  1. #include "Target.h"
  2.  
  3. int main()
  4. {
  5. ThreeElectricOutlet *outlet; //现在只能使用的目标 其它的也将适配为这个目标
  6. Wash *wash = new Wash(); //洗衣机本来就是使用的三相电(即继承的是ThreeElectricOutlet)
  7. outlet = wash;
  8. cout << "use three electric :" << endl;
  9. outlet->connectElectricCurrent();
  10.  
  11. Tv *tv = new Tv(); //电视只能使用两相电 现在将其适配为三相电
  12. ThreeElectricAdapter *adapter = new ThreeElectricAdapter(tv);
  13. outlet = adapter;
  14. cout << "use three electric :" << endl;
  15. outlet->connectElectricCurrent();
  16. return ;
  17. }

适配器模式的关键是建立一个适配器,这个适配器继承了目标接口并且包含被适配者的引用。还可以双向适配,即使用多继承,同时继承目标和被适配者,并且包含目标和被适配者的引用。

(五)适配器模式-C++实现的更多相关文章

  1. php设计模式五----适配器模式

    1.简介 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能. 意图:将一个类的接口转换成客户希望的另外一个接口 ...

  2. 【Java】 Java常用的几个设计模式实例

    一.单例模式 public class SingletonDemo { public static void main(String[] args) { // } } class User1{//饿汉 ...

  3. 设计模式(五)适配器模式Adapter(结构型)

      设计模式(五)适配器模式Adapter(结构型) 1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相 ...

  4. JAVA设计模式详解(五)----------适配器模式

    各位朋友好,本章节我们继续讲第五个设计模式. 在生活中,我们都知道手机内存卡是无法直接接电脑的,因为内存卡的卡槽比较小,而电脑只有USB插孔,此时我们需要用到读卡器.这个读卡器就相当于是适配器.这是生 ...

  5. Java设计模式(五)——适配器模式

    先举一个例子解释一下生活中的适配器模式:公司老总要求工程部经理来汇报一下公司内部的消防设备使用和维护情况.接到通知后,工程部经理老宋找了专门负责消防设备统计的维护人员小王,请他调出了去年全年的维护记录 ...

  6. 设计模式(七)适配器模式(Adapter Pattern)

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

  7. c#设计模式-适配器模式

    一. 适配器(Adapter)模式 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作. 名称由来 这很像变压器(Adapter),变压 ...

  8. Net设计模式实例之适配器模式(Adapter Pattern)

    一.适配器模式简介(Brief Introduction) 适配器模式,将一个类装换成客户期望的另外一个接口.Adapter模式使的原本由于接口不兼容而不能工作的那些类可以一起工作. 二.解决的问题( ...

  9. 设计模式学习之适配器模式(Adapter,结构型模式)(14)

    参考链接:http://www.cnblogs.com/zhili/p/AdapterPattern.html一.定义:将一个类的接口转换成客户希望的另一个接口.Adapter模式使得原本由于接口不兼 ...

随机推荐

  1. JavaScript_Html5_LocalStorage项目demo

    项目中localStorage实用 项目中h5本地存储的一个小实用,本意使用cookie,但发现chrome调试被禁用,便用了localStorage. 此需求是一贴吧搜索页,在新用户第一次点击搜索框 ...

  2. JavaScript中对象的比较

    Javascript中有'=='和'==='两种相等比较,后者是全等,会判断数据类型,前者是相等,在比较时,会发生隐式转换. 如果将两个对象做'=='比较,结果会如何呢? 比如有如下两个对象: var ...

  3. 用JSON.parse和eval出现的问题

    json格式非常受欢迎,而解析json的方式通常用JSON.parse()但是eval()方法也可以解析,这两者之间有什么区别呢? JSON.parse()之可以解析json格式的数据,并且会对要解析 ...

  4. 如何在sharepoint2010中配置Google Anlytics 分析服务

      简介 Google Analytics(分析)不仅可以帮助您衡量销售与转化情况,而且能为您提供新鲜的深入信息,帮助您了解访问者如何使用您的网站,他们如何到达您的网站,以及您可以如何吸引他们不断回访 ...

  5. ubuntu 12.04 react-native 安装

    1.安装nodejs 和npm apt-get install nodejs apt-get install npm 2. 升级node js 和npm sudo npm cache clean -f ...

  6. 【C语言】C语言运算符

    目录: [算术运算符] [自增运算符] [自减运算符] [关系运算符] [逻辑运算符] [三目运算符] [sizeof运算符] · 作用 1.算术运算符 +(加).-(减).*(乘)./(除).%(取 ...

  7. iOS中View生命周期与布局

    生命周期 说到view的生命周期一般都是指视图控制器的view生命周期. view的创建:loadView 视图控制器(UIViewController)及其子类,无论是手写代码还是storyboar ...

  8. mvc4 用NPOI导出Excel

    第一次做数据导出Excel,刚看到这个的时候,首先想到的就是新建一个excel的文件,然后将它下载,后来询问别人,他们都推荐使用NPOI,发现这个很好用,就用博客记录一下 1.引用NPOI包 2.导出 ...

  9. 不修改Xcode项目加载Reveal

    关 于iOS UI调试工具Reveal的配置,很多初学者朋友可能在网上搜索到一些文章,这些文章大部分都是讲述了如何通过配置Xcode项目,通过加入一些库文件, 并且在程序中编写额外的代码来调用Reve ...

  10. 网络请求之JSON解析

    <一>JSON的基本知识 什么是JSON:JSON的全称是JavaScript Object Notation(JavaScript对象符号),是目前使用最广泛的数据交换格式,具有跨平台. ...