设计模式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中man命令查询C函数
大家都知道在Unix/Linux中有个man命令,可以查询常用的命令,函数.可是对于我们这样只知道用"man 函数名"来查询的人来说,会遇到很多问题,比如: man read,我想 ...
- Ubuntu16.04 Tomcat9的安装
1. 从http://tomcat.apache.org/download-90.cgi 下载apache-tomcat-9.0.0.M11.tar.gz 2. 上传到Linux后移动到/opt/to ...
- HTML 标签 参考手册
按功能类别排列 基础 标签 描述 <!DOCTYPE> 定义文档类型. <html> 定义 HTML 文档. <title> 定义文档的标题. <body& ...
- Eclipse中如何clean项目以及clean的作用
http://blog.csdn.net/vipmao/article/details/51228171
- Pokémon Go呼应设计:让全世界玩家疯狂沉迷
引言:什么样的呼应设计会让移动游戏玩家沉迷?那必须为玩家构建一个属于玩家本人或者被玩家认可的虚拟环境.或者说是被玩家认可的虚拟世界.在移动游戏时代.想要做到这一点并不easy.但Pokémon Go却 ...
- Go基础---->go的第一个程序
今天我们学习搭建一个学习go语言的开发环境. Go语言 一.下载go 下载地址:https://golang.org/dl/ 校验下载,在命令行输入go version 二.编写第一个hello wo ...
- 利用CSS3制作淡入淡出动画效果
CSS3新增动画属性“@-webkit-keyframes”,从字面就可以看出其含义——关键帧,这与Flash中的含义一致. 利用CSS3制作动画效果其原理与Flash一样,我们需要定义关键帧处的状态 ...
- JS:ES5数组基本操作
一.添加删除 push(): 尾部添加,返回数组 pop(): 尾部删除,返回删除项 unshift() : 头部添加,返回数组 shift() : 头部删除,返回删除项 二.插入.替换 万能spli ...
- Javascript-const 常量
const 常量 常量是块级作用域,很像使用 let语句定义的变量.常量的值不能通过重新赋值来改变,并且不能重新声明. 此声明创建一个常量,其作用域可以是全局或本地声明的块. 与var变量不同,全局常 ...
- Struts2中的类型转换与复杂对象配合使用
form 标签可以被映射到一个属性的属性 manager.java package com.atguigu.struts2.model; import java.util.Date; public c ...