设计模式C++实现——适配器模式
模式定义:
适配器模式将一个类的接口。转换成客户期望的还有一个接口。适配器让原本接口不兼容的类能够合作无间。
适配器能够分为类适配器和对象适配器。
类适配器使用多重继承对一个接口与还有一个接口进行匹配。
对象适配器依赖于对象组合。
客户使用适配器的过程:
1. 客户通过目标接口调用适配器的方法对适配器发出请求。
2. 适配器使用被适配者接口把请求转换成被施培者的一个或多个调用接口
3. 客户接收到调用的结果,但并未察觉这一切是适配器在起转换作用。
模式结构:
类适配器
对象适配器
举例:
如今如果你缺少鸭子对象(叫声为Quack,飞行输出”I’m flying !”),想用一些火鸡对象(叫声为”Gobble gobble” 飞行输出”I’m flying a short distance!”)来冒充。显而易见。由于火鸡的接口(行为)不同,所以我们不能公然拿来使用。
UML设计:
编程实现及运行结果:
#include <iostream>
using namespace std;
//定义鸭子类
class Duck
{
public:
virtual void quack(){};
virtual void fly(){};
};
//定义绿头鸭
class MallardDuck : public Duck
{
public:
void quack()
{
cout << "Quack" << endl;
}
void fly()
{
cout << "I'm flying" << endl;
}
};
//定义火鸡
class Turkey
{
public:
virtual void gobble(){}
virtual void fly(){}
};
//定义野火鸡
class WildTurkey : public Turkey
{
public:
void gobble()
{
cout << "Gobble gobble" << endl;
}
void fly()
{
cout << "I'm flying a short distance" << endl;
}
};
//定义火鸡适配器
class TurkeyAdapter : public Duck
{
public:
TurkeyAdapter(Turkey* tur):turkey(tur){}
void quack()
{
turkey->gobble();
}
void fly()
{
turkey->fly();
}
private:
Turkey* turkey;
};
//客户代码
int main()
{
Duck* duck = new MallardDuck();
duck->quack();
duck->fly();
Duck* turkeyAdapter = new TurkeyAdapter(new WildTurkey());
turkeyAdapter->quack();
turkeyAdapter->fly();
return 0;
}
运行结果:
Quack
I'mflying
Gobblegobble
I'mflying a short distance
请按随意键继续. . .
适配器和装饰者模式比較:
适配器:将一个接口转成还有一个接口。包装某些对象,让它们的接口看起来不像自己而像别的东西。
装饰者:不改变接口,但增加责任。
将对象包装起来。让新行为增加类中。
设计模式C++实现——适配器模式的更多相关文章
- 设计模式 结构型 - 适配器模式 Adapter
Adapter(适配器模式) ---- 加个“适配器”以便于复用 将一个类的接口转换成客户希望的另一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 应用场景 如果 ...
- Java设计模式7:适配器模式
适配器模式 适配器模式说的是,可以把一个类的接口变换成客户端所期待的另一种接口,使得原本因接口不匹配而无法在一起工作的两个类可以一起工作. 适配器模式的用途 适配器模式的用途,在网上找了一幅图,挺形象 ...
- 设计模式学习之适配器模式(Adapter,结构型模式)(14)
参考链接:http://www.cnblogs.com/zhili/p/AdapterPattern.html一.定义:将一个类的接口转换成客户希望的另一个接口.Adapter模式使得原本由于接口不兼 ...
- 【读书笔记】读《JavaScript设计模式》之适配器模式
一.定义 适配器模式可用来在现有接口和不兼容的类之间进行匹配.使用这种模式的对象又叫包装器(wrapper),因为它们是在用一个新的接口包装另一个对象.在设计类的时候旺旺会遇到有些接口不能与现有API ...
- IOS设计模式之三(适配器模式,观察者模式)
本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq) ...
- Java设计模式系列之适配器模式
适配器模式的定义 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.(就类似于我们充电器的转接头将220V的电压转换成我们的手机端 ...
- java设计模式笔记(1)-适配器模式
适配器的定义 适配器就是一个接口转换器,它可以是一个独立的硬件接口设备,允许硬件或电子接口与其它硬件或电子接口相连,也可以是信息接口.比如:电源适配器.三角架基座转接部件.USB与串口的转接设备等. ...
- Java程序设计模式系列之适配器模式
理解适配器设计模式需要从生活中的场景进行联系,在生活当中有那些东西能够称为适配器呢?从字面上理解,"适配"的意思就是让一个东西和另一个东西配对,能够让他们一起工作,比如大家用的笔记 ...
- Java设计模式学习记录-适配器模式
前言 之前已经将五个创建型设计模式介绍完了,从这一篇开始介绍结构型设计模式,适配器模式就是结构型模式的一种,适配器要实现的效果是把“源”过渡到“目标”. 适配器模式 在开发过程中,使用一个已经存在的类 ...
- 设计模式入门,适配器模式,c++代码实现
// test07.cpp : Defines the entry point for the console application.// #include "stdafx.h" ...
随机推荐
- Linux crontab 实现每秒执行
Linux crontab 实现每秒执行 linux crontab 命令,最小的执行时间是一分钟.如需要在小于一分钟内重复执行,可以有两个方法实现. 1.使用延时来实现每N秒执行 创建一个php做执 ...
- 个别图片IE中无法显示问题
今天有人保障,某些图片在IE下无法打开,但是其他浏览器均没有问题.以前还真没遇到过这类问题,从上至下查看了一遍,能排除的因素基本都排除了,还是不知道为什么不能显示,真是奇怪了.最后注意到无法显示的图片 ...
- 扩展KMP - HDU 4333 Revolving Digits
Revolving Digits Problem's Link Mean: 给你一个字符串,你可以将该字符串的任意长度后缀截取下来然后接到最前面,让你统计所有新串中有多少种字典序小于.等于.大于原串. ...
- cssText方式写入css
<div class="a" id="a">hello world</div> <script> //通过JS来覆写对象的样 ...
- VS2005环境下采用makefile编译、使用libjpeg.lib函数库
1.从www.ijg.org下载源码,解压后得到文件夹jpeg-8d 2.在文件夹里新建jconfig.h文件,将jconfig.vc里的内容拷到jconfig.h中 3.编译. Run->CM ...
- hdu 2234(IDA*)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2234 思路:IDA*可以搞,借鉴的是大牛的启发式函数h(): 可以考虑把每一行上的数转化成相同的,或者 ...
- JavaScript 二、eval 和 with 函数
/* * ========================================================= * * JavaScript 词法欺骗 * * 1.欺骗词法作用域,会导致 ...
- 自己实现一个Promise库
源码地址 先看基本使用 const promise = new Promise((resolve, reject) => { resolve(value) // or reject(reason ...
- XAML 中使用空格键(空白字符)
默认情况下,XAML折叠所有空白,这意味着包含空格.tab 键以及回车的长字符串将被转换为单个空格.而且,如果在一个元素内容之前或之后添加空白,这个空格将被完全忽略. 有时这并不是所期望的结果.例如, ...
- 【C++缺省函数】 空类默认产生的6个类成员函数
1.缺省构造函数. 2.缺省拷贝构造函数. 3. 缺省析构函数. 4.缺省赋值运算符. 5.缺省取址运算符. 6. 缺省取址运算符 const. <span style="font-s ...