将一个类的接口转换成客户希望的另外一个接口。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. 使用 SVG 动画实现弹性的页面元素效果

    Codrops 分享了一些给SVG元素加上弹性动画的灵感.实现的思路是把一个SVG元素整合成一个组件,然后从一个路径弹性动画到另一个.这种效果可以应用到像菜单,按钮或其它元素,使得交互更有趣,看起更原 ...

  2. 提升手持设备点击速度之touch事件带来的坑!

    前言 上周六,我将我们项目的click换成了tap事件,于是此事如梦魇一般折磨了我一星期!!! 经过我前仆后继的努力,不计代价的牺牲,不断的埋坑填坑,再埋坑的动作,最后悲伤的发现touch事件确实是个 ...

  3. Html技巧 语义化你的代码

    首先是关于语义(Semantics)和默认样式的区别,默认样式是浏览器设定的一些常用tag的表现形式,语义化的主要目的就是让大家直观的认识标签(markup)和属性(attribute)的用途和作用. ...

  4. iOS UIAlertController

    在Xcode的iOS9.0 SDK中,UIAlertView和UIActionSheet都被UIAlertController取代. 在iOS 9中,UIAlertController在功能上是和UI ...

  5. Marketing with Microsoft Dynamics CRM IDEA CONFERENCE

    Object:Marketing with Microsoft Dynamics CRM  IDEA CONFERENCE  24 SEPTEMBER 2015 | BROADCAST ONLINE ...

  6. zookeeper入门讲解事例

    zookeeper使用和原理探究(一) zookeeper介绍zookeeper是一个为分布式应用提供一致性服务的软件,它是开源的Hadoop项目中的一个子项目,并且根据google发表的<Th ...

  7. Android开发中遇到的小问题 一

    1)想要ListView活着Girdview左右留些空隙,但Scrollbar要在屏幕最右边 在xml中加入 android:paddingLeft="8dp" android:p ...

  8. 【代码笔记】iOS-将log日志保存到文件

    代码: #import "AppDelegate.h" #import "RootViewController.h" @implementation AppDe ...

  9. 【代码笔记】iOS-获得现在的时间

    一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. ...

  10. iOS如何获取网络图片(一)

    static NSString * baseUrl = @"http://192.168.1.123/images/"; - (UITableViewCell *)tableVie ...