大话设计模式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 ...
随机推荐
- hdu2688 Rotate(树状数组)
题目链接:pid=2688">点击打开链接 题意描写叙述:对一个长度为2<=n<=3000000的数组,求数组中有序对(i<j而且F[i]<F[j])的数量?其 ...
- HDOJ 题目3518 Boring counting(后缀数组,求不重叠反复次数最少为2的子串种类数)
Boring counting Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- c语言实现皇帝翻牌游戏
一个综合的游戏,对所学的知识进行整合!融会贯通! #include <stdio.h> #include <stdlib.h> #include <string.h> ...
- USACO 2.1 Sorting a Three-Valued Sequence
Sorting a Three-Valued Sequence IOI'96 - Day 2 Sorting is one of the most frequently performed compu ...
- ubuntu 使用阿里云 apt 源
以下内容来自 https://opsx.alibaba.com/mirror Ubuntu对应的“帮助”信息 修改方式:打开 /et/apt/sources.list 将http://archive. ...
- React组件化开发
环境搭建: 1.安装node.js 2.安装cnpm # npm install -g cnpm --registry=https://registry.npm.taobao.org 3.全局安装c ...
- 打包phar文件过大的问题。
根据一个开源工具得到的灵感,使用流打包,并使用token_get_all移除了所用PHP文件的空白.现在打包出来只有93k了.谢谢关注. 我一个简单的文件,加上一个symfony的process包,打 ...
- uni-app 自定义扫码界面
二维码扫描,已经成为当下一款应用不可或缺,同时也是用户习以为常的功能了.uni-app 为我们提供了扫码 API ,直接调用即可. 需求场景 在实际开发中,平台提供的默认扫码界面,并不能满足一些自定义 ...
- Unity 动画系统(Mecanim) 术语及翻译 表格
原文 翻译 Animation Clip 视频片段 Avatar 阿凡达 Retargeting 重定向 Rigging 绑定 skinning 蒙皮 Animator Component 动画组件 ...
- 构造器参数过多时考虑使用构建器(Builder)
一.静态工厂和构造器的局限性 面对需要大量可选参数才能构建对象时,静态工厂和构造器并不能随着可选参数的增加而合理扩展. 假设创建一个类Person需要使用大量的可选参数,其中两个参数是必填的,剩下的都 ...