大话设计模式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 ...
随机推荐
- Android之应用开发基础
Android应用开发基础 英文地址:http://developer.android.com/guide/components/fundamentals.html 本人英语水平不高,如有翻译不当请指 ...
- POJ - 3257 Cow Roller Coaster (背包)
题目大意:要用N种材料建一条长为L的路,如今给出每种材料的长度w.起始地点x.发费c和耐久度f 问:在预算为B的情况下,建好这条路的最大耐久度是多少 解题思路:背包问题 dp[i][j]表示起始地点为 ...
- 【Hibernate步步为营】--单向关联一对一映射
上篇文章对多对一的关联映射做了具体的分析,它在实现上能够有两种方式,而且这两种方式实现也非常easy,关键是标签<many-to-one>的使用,它分别指明了多端和一端的映射关系.这样的映 ...
- 【1】按照Django官网,编写一个web app 创建project/配置数据库
1. Creating a project From the command line, cd into a directory where you'd like to store your code ...
- 2015.04.29,外语,读书笔记-《Word Power Made Easy》 14 “如何谈论日常现象” SESSION 39
HOW TO TALK ABOUT COMMON PHENOMENA AND OCCURRENCES TEASER PREVIEW dire(['daiә(r)] adj. 可怕的,悲惨的,灾难警告的 ...
- 使用VMware搭建3台一模一样的Linux虚拟机
转自:https://www.linuxidc.com/Linux/2014-08/105909.htm 简介:VMware可以在个人本地一台笔记本机器上同时运行二个或更多Windows.DOS.LI ...
- Core篇——初探Core的Http请求管道&&Middleware
目录: 1.Core 处理HTTP请求流程 2.中间件(Middleware)&&处理流程 3.创建自定义中间件&&模拟Core的请求管道 Core 处理HTTP请求流 ...
- 微信小程序中获取高度及设备的方法
由于js中可以采用操纵dom的方法来获取页面元素的高度,可是在微信小程序中不能操纵dom,经过查找之后发现仅仅只有以下几个方法可以获取到高度 wx.getSystemInfoSync().window ...
- Sphinx在windows下安装使用[支持中文全文检索]
原文地址:http://www.fuchaoqun.com/2008/11/sphinx-on-windows-xp/ 前 一阵子尝试使用了一下Sphinx,一个能够被各种语言(PHP/Python/ ...
- thinkphp 5 count()方法在控制器,模板中的使用方法
thinkphp中关于count()方法的使用: 控制器中:echo count($arr)模板中:{$arr | count}模板中if判断语句中 <if condition="co ...