大话设计模式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 ...
随机推荐
- [React] How to use a setState Updater Function with a Reducer Pattern
In this lesson we'll walk through setting up an updater function that can receive an action argument ...
- linux启动器文件(快捷方式)的制作方法
众所周知.和windows不同,linux的软件安装方式是五花八门的= = 实用sh脚本写的,有tar包自己编译的.有rpm格式的,有deb的,有各种奇葩路径然后+chmod权限执行的.还有改各种配置 ...
- Mysql第四天 数据库设计
不考虑主备.集群等方案,基于业务上的设计主要是表结构及表间关系的设计. 而关于表中字段主要是依据业务来进行定义,我们能够指定的大概有这么几项: 存储引擎 一般用InnoDB,特殊需求特殊选用 字符集和 ...
- 具体图解 Flume介绍、安装配置
写在前面一: 本文总结"Hadoop生态系统"中的当中一员--Apache Flume 写在前面二: 所用软件说明: 一.什么是Apache Flume 官网:Flume is a ...
- SSD纠错码向LDPC码演变
作者:Stephen Bates SSD控制器芯片中採用的纠错编码(ECCs)的类型正在发生一场演变.相信很多这篇博文的读者对此都有所了解.传统上採用的纠错码是基于群变换的博斯-查德胡里-霍昆格母(B ...
- php面向对象之构造函数和析构函数
php面向对象之构造函数和析构函数 简介 php面向对象支持两种形式的构造函数和析构函数,一种是和类同名的构造函数(php5.5之前),一类是魔术方法(php5.5之后).与类名相同的构造函数优先级比 ...
- WPF动态控件生成查找不到问题
2012 08 10 遇到此类问题,已经找到解决方案 记录以备后用 动态往界面添加控件 在页面未显示的情况时,虽然对控件增加了id name等属性但是使用 TextBox txtOtherNati ...
- 阿里云Maven中央仓库配置
方式一:统一配置 在maven安装目录/conf下的settings.xml 文件里配置mirrors的子节点,添加如下mirror <mirror> <id>alimaven ...
- React router内是如何做到监听history改变的
问题背景 今天面试的时候,被问到这么个问题.在html5的history情况下,pushstate和replacestate是无法触发pushstate的事件的,那么他是怎么做到正确的监听呢?我当时给 ...
- Android 自定义简单控件--星级评价
效果图 实现 package com.easypass.carstong.view; import android.content.Context; import android.content.re ...