大话设计模式C++实现-第17章-适配器模式
一、UML图
关键词:Client须要Request()函数,Adaptee提供的是SpecificRequest()函数,Adapter提供一个Request()函数将Adaptee和SpecificeRequest()函数封装起来。
二、概念
适配器模式:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原来因为接口不兼容而不能一起工作的那些类能够一起工作。
三、说明
角色:
(1)Target:这是客户所期待的接口,Target能够是详细的或抽象的类,也能够是接口。
(2)Adaptee:须要适配的类。
(3)Adapter:通过在内部包装一个Adaptee对象,把源接口转换成目标接口。
什么时候用?
(1)在想使用一个已存在的类,可是假设他的接口,也就是它的方法和你的要求不同样时,就应该考虑用适配器模式。
(2)用了适配器模式。客户代码能够统一调用统一接口即可了,这样能够更简单。更直接,更紧凑。
(3)要在两方都不太easy改动的时候再使用适配器模式适配,而不是一有不同是就使用它。
四、C++实现
(1)Adapter.h
#ifndef ADAPTER_H
#define ADAPTER_H #include <string>
#include <iostream> //Target,此处为运动员
class Player
{
protected:
std::string name;
public:
Player(std::string name)
{
this->name=name;
}
virtual void Attack()=0;
virtual void Defense()=0;
}; //Adaptee,此处为外籍中锋。它的接口和Target的接口不一样,需要翻译来帮忙转换
class ForeignCenter
{
private:
std::string name;
public:
void SetName(std::string name)
{
this->name=name;
}
std::string GetName()
{
return name;
}
void ForeignAttack()
{
std::cout<<"外籍中锋 "<<name<<" 进攻"<<std::endl;
} void ForeignDefense()
{
std::cout<<"外籍中锋 "<<name<<" 防守"<<std::endl;
}
}; //Adapter,此处为翻译
class Translator:public Player
{
private:
ForeignCenter* wjzf;
public:
Translator(std::string name):Player(name)
{
wjzf=new ForeignCenter;
wjzf->SetName(name);
}
~Translator()
{
delete wjzf;
}
void Attack()
{
wjzf->ForeignAttack();
} void Defense()
{
wjzf->ForeignDefense();
}
}; //以下是普通的 接口和Target接口一样的 3个子类,必需要翻译
//前锋
class Forwards:public Player
{
public:
Forwards(std::string name):Player(name){} void Attack()
{
std::cout<<"前锋 "<<name<<" 进攻"<<std::endl;
} void Defense()
{
std::cout<<"前锋 "<<name<<" 防守"<<std::endl;
}
}; //中锋
class Center:public Player
{
public:
Center(std::string name):Player(name){} void Attack()
{
std::cout<<"中锋 "<<name<<" 进攻"<<std::endl;
} void Defense()
{
std::cout<<"中锋 "<<name<<" 防守"<<std::endl;
}
}; //后卫
class Guards:public Player
{
public:
Guards(std::string name):Player(name){} void Attack()
{
std::cout<<"后卫 "<<name<<" 进攻"<<std::endl;
} void Defense()
{
std::cout<<"后卫 "<<name<<" 防守"<<std::endl;
}
}; #endif
(2)Client.cpp
#include "Adapter.h"
#include <iostream>
#include <cstdlib>
#include <string> //Client
void main()
{
Player* b=new Forwards("巴蒂尔");
b->Attack(); Player* m=new Guards("麦克格雷迪");
m->Attack(); //翻译告诉姚明。教练让你既要进攻,又要防守
Player* ym=new Translator("姚明");
ym->Attack();
ym->Defense(); delete b;
delete m;
delete ym; system("pause");
}
(3)执行截图
大话设计模式C++实现-第17章-适配器模式的更多相关文章
- 大话设计模式C++实现-第1章-简单工厂模式
一.UML图 二.包括的角色 简单工厂模式包括三个角色: (1)工厂类Factory:工厂类是用来制造产品的. 因此,在Factory中有一个用于制造产品的Create函数或者Generate函数之类 ...
- 大话设计模式C++实现-第15章-抽象工厂模式
一.UML图 二.概念 抽象方法模式(Abstract Factory):提供一个创建一系列相关或互相依赖对象的接口,而无需指定他们详细的类. 三.包括的角色 (1)抽象工厂 (2)详细工厂:包含详细 ...
- 大话设计模式C++达到-文章16章-国家模式
一.UML画画 二.概念 状态模式(State):当一个对象的内在状态改变时同意改变其行为.这个对象看起来像是改变了其类. 三.说明 以下是来自书本和网络的对状态模式的定义和分析: (1)状态模式同意 ...
- 大话设计模式C++实现-第22章-桥接模式
一.UML图 二.概念 桥接模式(Bridge):将抽象部分与它的实现部分分离,使他们都能够独立地变化. 三.说明 为什么叫"桥接模式"? 如上所看到的的UML图中,有一个聚合线, ...
- 大话设计模式C++达到-文章12章-外观模式
一.UML画画 关键词:添加Facade层. 二.概念 外观模式:为子系统中的一组接口提供一个一致的界面.此模式定义了一个高层接口,这个接口使得这一子系统更加easy使用. 三.说明 Q:外观模式在什 ...
- 大话设计模式C++实现-文章7章-代理模式
一个.UML画画 二.概念 代理模式:为其它对象提供一种代理以控制对这个对象的訪问. 三.应用场景 (1)远程代理.也就是为一个对象在不同的地址空间提供局部代表.这样能够隐藏一个对象存在于不同地址空间 ...
- 大话设计模式C++实现-第19章-组合模式
一.UML图 关键词:Leaf是叶子,Composite是非叶子节点,Composite包括Leaf. 二.概念 组合模式(Composite):将对象组合成树形结构以表示"部分-总体&qu ...
- 大话设计模式C++实现-第14章-观察者模式
一.UML图 关键词:Subject维护一个Observer列表.Subject运行Notify()时就运行列表中的每一个Observer的Update(). 二.概念 观察者模式:定义了一种一对多的 ...
- 大话设计模式C++实现-第8章-工厂方法模式
一.UML图 二.概念 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法是一个类的实例化延迟到其子类. 三.包括的角色 (1)抽象工厂 (2 ...
随机推荐
- Java——动态代理
在静态代理中,我们在调用target类的时候,都是先拿到proxy类.由于proxy类中将target类作为了成员变量,而且跟target类继承了一样的接口,具有同样的方法,所以,在proxy类中.通 ...
- (十一)Unity5新特性----实战2D游戏
孙广东 2015.7.11 在本教程中,将了解到U5新功能.你通过本教程.您将了解下面内容: Changes in Component Access Physics Effectors Adding ...
- MQ发送定时消息
通过延时发送来发送定时消息. RocketMQ只支持固定精度时间的延时消息发送:1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h 若 ...
- STM32F030, 使用嘀嗒定时器Systick实现LED闪烁
本文主要解决两个问题 1 STM32的IO口要反转,怎么实现? 2 嘀嗒定时器systick的配置 解答1: 单片机的口,反转非常easy.sbit led = P1 ^6; led = ~led; ...
- 王立平--TF卡
最终知道TF卡是什么了... TF卡又称microSD,是一种极细小的快闪存储器卡,由SanDisk(闪迪)公司发明创立. 这样的卡主要于手机使用.但因它拥有体积极小的长处,随着不断提升的容量. 它慢 ...
- Codeforces Round #316 (Div. 2)E. Pig and Palindromes DP
E. Pig and Palindromes Peppa the Pig was walking and walked into the forest. What a strange coinci ...
- P1233 木棍加工
P1233 木棍加工 题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间 ...
- .NET平台开源JSON序列化
转载: http://blog.csdn.net/ddgweb/article/details/39643747 一个简单示例: String str = "{’name’:’cyf’,’i ...
- ROS集成开发环境RoboWare Studio安装教程
前言:很多人说vim是最快的,所以我选择用roboware. ROS 自带的编辑器vim增加插件,效果如下: RoboWare Studio,效果如下: 下面开始安装. 一.安装 去官网 http:/ ...
- 基于Socket的Winform例子
一.直接上效果图 二.Socket握手 三.服务端 Thread threadWatch = null;// 负责监听客户端的线程 Socket socketWatch = null;// 负责监听客 ...