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

该模式中有三种角色:

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

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

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

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

(1)Target.h

 #ifndef _TARGET_H_
#define _TARGET_H_
#include <iostream>
#include <string>
using namespace std;
//目标 (就是适配成这样的,都使用这种)
class ThreeElectricOutlet{
public:
virtual void connectElectricCurrent() = ; }; //被适配者 (现在不能使用它,把它适配为可以使用)
class TwoElectricOutlet{
public:
virtual void connectElectricCurrent() = ;
}; //适配器
class ThreeElectricAdapter : public ThreeElectricOutlet{
private:
TwoElectricOutlet *myOutlet; public:
ThreeElectricAdapter(TwoElectricOutlet *outlet);
void connectElectricCurrent() override;
}; //具体目标
class Wash : public ThreeElectricOutlet{
public:
Wash();
Wash(string s);
void connectElectricCurrent() override; private:
string name; }; //具体被适配者
class Tv : public TwoElectricOutlet{
public:
Tv();
Tv(string s);
void connectElectricCurrent() override;
private:
string name; }; #endif

(2)Target.cpp

 #include "Target.h"

 ThreeElectricAdapter::ThreeElectricAdapter(TwoElectricOutlet *outlet)
{
myOutlet = outlet;
} void ThreeElectricAdapter::connectElectricCurrent()
{
myOutlet->connectElectricCurrent();
} Wash::Wash()
{
name = "洗衣机";
}
Wash::Wash(string s)
{
name = s;
} void Wash::connectElectricCurrent()
{
cout << name << "begin wash" << endl;
} Tv::Tv()
{
name = "电视机";
} Tv::Tv(string s)
{
name = s;
} void Tv::connectElectricCurrent()
{
cout << name << "begin play video" << endl;
}

(3)AdapterTest.cpp

 #include "Target.h"

 int main()
{
ThreeElectricOutlet *outlet; //现在只能使用的目标 其它的也将适配为这个目标
Wash *wash = new Wash(); //洗衣机本来就是使用的三相电(即继承的是ThreeElectricOutlet)
outlet = wash;
cout << "use three electric :" << endl;
outlet->connectElectricCurrent(); Tv *tv = new Tv(); //电视只能使用两相电 现在将其适配为三相电
ThreeElectricAdapter *adapter = new ThreeElectricAdapter(tv);
outlet = adapter;
cout << "use three electric :" << endl;
outlet->connectElectricCurrent();
return ;
}

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

(五)适配器模式-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. Apple Watch PSD 源文件【免费素材下载】

    Apple Watch 是苹果公司于2014年9月发布的一款智能手表.分为运动款.普通款和定制款三种,采用蓝宝石屏幕,有银色,金色,红色,绿色和白色等多种颜色可以选择.这里分享的是 Apple Wat ...

  2. Cool!15个创意的 CSS3 文本效果【下篇】

    这里文章收集了15个创意的 CSS3 文本效果,所有的都是精心挑选,这些可能会增加创意的火花到你的下一个项目.其中有些是用于特定用途,而另一些则适用于多种用途.如果你想要一个精彩而又充满色彩的文字效果 ...

  3. 1:时间戳转换成年月日函数,2:url截取参数方法,3:弹窗自定义方法 4:点击按钮加入购物车

    最近一直在使用vue.js来构建项目,先分享一下一些简单可复用的函数. 1:时间戳转换Date.prototype.format = function(fmt){ //author: yumeiqia ...

  4. 移动Web开发的bug及解决方案

    我目前移动Web开发遇到的bug以及解决方案(慢慢补充当中). 1.android4.0以上一部分手机的webview中,当canvas小于屏幕大小时,绘图时会出现重影,就是说一个图只绘制了一遍,却出 ...

  5. BP神经网络实现

    # -*- coding: utf-8 -*- # -------------------------------------------------------------------------- ...

  6. ArcGisServer根据最大最小坐标换算瓦片行列号

    1.前言 在上一节中我们知道了屏幕上一像素等于实际中多少单位长度(米或经纬度)的换算方法,而知道这个原理后,接下来我们要怎么用它呢?它和我们前端显示地图有什么关联呢?这一节,我会尽量详细的将这两个问题 ...

  7. 访问其他程序的SheardPreferents

    程序A: SharedPreferences preferences=getSharedPreferences("myPreferences", Context.MODE_WORL ...

  8. IOS 音效

    IOS 音效 音效我们也可以成为短音频通常在程序中播放时间为1~2秒. 在应用程序中起到点缀效果,提升整体用户体验 音效文件只需要加载一次 示例代码: // // ViewController.m / ...

  9. jQuery和ExtJS的timeOut超时问题和event事件处理问题

    对jQuery来说,超时可以直接设置timeout参数,并在error事件中捕获第二个参数,如果是“timeout”则表明捕获了超时事件,非常清楚. 例子: $.ajax({         type ...

  10. 荷兰国旗 Flag of the Kingdom of the Netherlands

    问题描述:现有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右的球依次为红球.白球.蓝球.这个问题之所以叫做荷兰国旗,是因为将红白蓝三色的小球弄成条状物,并有序排列 ...