(五)适配器模式-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模式使得原本由于接口不兼 ...
随机推荐
- pywebsocket的搭建
Python可以搭建pywebsocket(Web服务器,python websocket),搭建pywebsocket必须要已经安装了python,点我查看python的下载与安装.在这篇Blog中 ...
- 极富创意的3D文件夹切换效果
今天分享的是一个极富创意的文件夹切换效果.这个案例使用CSS 3动画实现了一个3D的平行六面体旋转效果.点击顶部的3个按钮可以旋转并切换.另外,每个六面体本身是一个文件夹,点击后可以展开查看里面的详情 ...
- Icon Font浅谈
这周继续在弄hybird app 的 UI框架的重构,进行到了编写换肤功能的阶段,而在做换肤之前,我想应该先弄一套框架内置的图标. 而图标无非就是两种做法: 1.图片 使用图片很正常,但是有缺陷的. ...
- 见见面、聊聊天 - 5月22日晚7点Meetup,三里屯绿树旁酒吧,畅谈云技术和应用
总是邮件.QQ什么的线上聊,让我们见面吧,不怕见光死,呵呵. 我和同事会先抛砖引玉,给大家介绍一下Autodesk几款最新的云技术和解决方案,然后大家就可畅所欲言,自由交流.来自五湖四海的人,为了 ...
- Kotlin:Android世界的Swift
转自:http://www.infoq.com/cn/news/2015/06/Android-JVM-JetBrains-Kotlin Kotlin是一门与Swift类似的静态类型JVM语言,由Je ...
- android自定义activity
今天公司有个需要需要自动弹出界面,而dialog又不符合要求,所以自定义的一个activity的样式 首先在androidmainfest.xml上注册你的activity <activity ...
- asp.net mvc 应用Bundle(捆绑和微小)压缩技术 启用 BundleConfig 配置web.config
从MVC4开始,我们就发现,项目中对Global.asax进行了优化,将原来在MVC3中使用的代码移到了 [App_Start]文件夹下,而Global.asax只负责初始化.其中的BundleCon ...
- request,session,application
JSP 的3个内置对象request,session,application,其实都有一个作用域,这些对象内部有一个Map成员用于存放数据,比如session对象的setAttribute(key,v ...
- Oracle global database name与db link的纠缠关系
ORACLE数据库中Global Database Name与DB LINKS的关系还真是有点纠缠不清,在说清楚这个关系前,我们先来了解一下Global Database Name的概念 Global ...
- Use Excel Pivot Table as a BI tool
Normally, we have created a table, view in database or cube in SSAS, user can use Excel as a BI tool ...