(五)适配器模式-C++实现
将一个类的接口转换成客户希望的另外一个接口。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++实现的更多相关文章
- php设计模式五----适配器模式
1.简介 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能. 意图:将一个类的接口转换成客户希望的另外一个接口 ...
- 【Java】 Java常用的几个设计模式实例
一.单例模式 public class SingletonDemo { public static void main(String[] args) { // } } class User1{//饿汉 ...
- 设计模式(五)适配器模式Adapter(结构型)
设计模式(五)适配器模式Adapter(结构型) 1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相 ...
- JAVA设计模式详解(五)----------适配器模式
各位朋友好,本章节我们继续讲第五个设计模式. 在生活中,我们都知道手机内存卡是无法直接接电脑的,因为内存卡的卡槽比较小,而电脑只有USB插孔,此时我们需要用到读卡器.这个读卡器就相当于是适配器.这是生 ...
- Java设计模式(五)——适配器模式
先举一个例子解释一下生活中的适配器模式:公司老总要求工程部经理来汇报一下公司内部的消防设备使用和维护情况.接到通知后,工程部经理老宋找了专门负责消防设备统计的维护人员小王,请他调出了去年全年的维护记录 ...
- 设计模式(七)适配器模式(Adapter Pattern)
一.引言 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将“将现存的对象”在新的环境中进行调用 ...
- c#设计模式-适配器模式
一. 适配器(Adapter)模式 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作. 名称由来 这很像变压器(Adapter),变压 ...
- Net设计模式实例之适配器模式(Adapter Pattern)
一.适配器模式简介(Brief Introduction) 适配器模式,将一个类装换成客户期望的另外一个接口.Adapter模式使的原本由于接口不兼容而不能工作的那些类可以一起工作. 二.解决的问题( ...
- 设计模式学习之适配器模式(Adapter,结构型模式)(14)
参考链接:http://www.cnblogs.com/zhili/p/AdapterPattern.html一.定义:将一个类的接口转换成客户希望的另一个接口.Adapter模式使得原本由于接口不兼 ...
随机推荐
- 灵感来自 Google & YouTube 的苗条的进度栏效果
NProgress.js 是纳米级的进度条插件.拥有逼真的的涓涓细流动画效果来告诉你的用户,某些事情正在发生.它的灵感来自于谷歌,YouTube,应用了,这款苗条的进度条是完美的,适用于 Turbol ...
- go语言常用函数:copy
数组切片内容复制 用于将内容从一个数组切片复制到另一个数组切片.如果加入的两个数组切片不一样大,就会按其中较小的那个数组切片的元素个数进行复制. slice1 := [], , , , } slice ...
- SAP用户权限解剖及自修改
通常BASIS会使用PFCG做权限管理,时你保存时会产生一个系统外的profile name,记得SU01时用户有profile 和role两栏位吗?它们的关系如何呢? 首先明白几个概念.1.acti ...
- sharepoint2010升级到sharepoint2013的升级步骤和过程
- [Android]Activity启动过程
Android系统启动加载流程: 参考图 Linux内核加载完毕 启动init进程 init进程fork出zygote进程 zygote进程在ZygoteInit.main()中进行初始化的时候for ...
- 操作系统开发系列—13.i.进程调度 ●
上面的三个进程都是延迟相同的时间,让我们修改一下,尝试让它们延迟不同的时间. void TestA() { int i = 0; while (1) { disp_str("A." ...
- 【C语言】C语言运算符
目录: [算术运算符] [自增运算符] [自减运算符] [关系运算符] [逻辑运算符] [三目运算符] [sizeof运算符] · 作用 1.算术运算符 +(加).-(减).*(乘)./(除).%(取 ...
- UIScrollView之轮转图片
在iOS开发中,经常会在APP首页看到多张图片进行轮换.刚开始做的时候,感觉很麻烦,不是很好做,查阅资料后,我总结了一下,自己封装了一个简单的轮转图片库: UIScrollView无限滑动 ,只需要三 ...
- iOS Xcode编译报错问题解决办法汇总
1. 编译出现错误:linker command failed with exit code 1 第一种方法:找到Build settings->Linking->Other Linker ...
- JavaScript Patterns 5.2 Declaring Dependencies
It’s a good idea to declare the modules your code relies on at the top of your function or module. T ...