[大话设计模式C++版] 第17章 在NBA我需要翻译 —— 适配器模式
源码可以在这里找到 大话设计模式C++版
篮球翻译适配器
//Player.h 球员基类
#include <QString>class Player
{protected:QString m_name;
public:Player(QString name) : m_name(name) {}virtual void Attack() = 0;virtual void Defense() = 0;virtual ~Player() {}
};
//Forward.h 前锋类
#pragma execution_character_set("utf-8")
#include <QDebug>
#include "Player.h"class Forward : public Player
{public:Forward(QString name) : Player(name) {}virtual void Attack() {qDebug() << QString("前锋%1进攻").arg(m_name);}virtual void Defense() {qDebug() << QString("前锋%1防守").arg(m_name);}virtual ~Forward() {}
};
//Center.h 中锋类
#pragma execution_character_set("utf-8")
#include <QDebug>
#include "Player.h"class Center : public Player
{public:Center(QString name) : Player(name) {}virtual void Attack() {qDebug() << QString("中锋%1进攻").arg(m_name);}virtual void Defense() {qDebug() << QString("中锋%1防守").arg(m_name);}virtual ~Center() {}
};
//Guards.h 后卫类
#pragma execution_character_set("utf-8")
#include <QDebug>
#include "Player.h"class Guards : public Player
{public:Guards(QString name) : Player(name) {}virtual void Attack() {qDebug() << QString("后卫%1进攻").arg(m_name);}virtual void Defense() {qDebug() << QString("后卫%1防守").arg(m_name);}virtual ~Guards() {}
};
//main.cpp
#pragma execution_character_set("utf-8")
#include "Player.h"
#include "Forward.h"
#include "Center.h"
#include "Guards.h"
#include <memory>using namespace std;int main(int argc, char *argv[])
{shared_ptr<Player> b(new Forward("巴蒂尔"));b->Attack();shared_ptr<Player> m(new Guards("麦格克雷迪"));m->Attack();shared_ptr<Player> ym(new Center("姚明"));ym->Attack();ym->Defense();return 0;
}
运行结果:
"前锋巴蒂尔进攻"
"后卫麦格克雷迪进攻"
"中锋姚明进攻"
"中锋姚明防守"
姚明可能听不懂 Attack
和 Defense
,中间需要翻译,且姚明应该属于外籍中锋
//ForeignCenter.h 外籍中锋
#pragma execution_character_set("utf-8")
#include <QDebug>
#include <QString>class ForeignCenter
{private:QString m_name;
public:ForeignCenter(QString name) : m_name(name) {}void jingong() {qDebug() << QString("外籍中锋 %1 进攻").arg(m_name);}void fangshou() {qDebug() << QString("外籍中锋 %1 防守").arg(m_name);}const QString &getName() const {return m_name;}void setName(const QString &name) {m_name = name;}
};
//Translator.h 翻译者
#pragma execution_character_set("utf-8")
#include "Player.h"
#include "ForeignCenter.h"
#include <memory>using namespace std;class Translator : public Player
{shared_ptr<ForeignCenter> wjzf;
public:Translator(QString name) : Player(name) {wjzf = shared_ptr<ForeignCenter>(new ForeignCenter("姚明"));}virtual void Attack() {wjzf->jingong();}virtual void Defense() {wjzf->fangshou();}virtual ~Translator() {}
};
运行结果:
"前锋巴蒂尔进攻"
"后卫麦格克雷迪进攻"
"外籍中锋 姚明 进攻"
"外籍中锋 姚明 防守"
Adapter适配器模式 [李建忠C++笔记]
"接口隔离"模式
- 在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题、甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口是一种常见的解决方案。
- 典型模式
- Facade
- Proxy
- Adapter
- Mediator
动机(Motivation)
- 在软件系统中,由于应用环境的变化,常常需要将”一些现存的对象“放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。
- 如何应对这种”迁移的变化“?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?
//Adapter.cpp
//目标接口(新接口)
class ITarget {public:virtual void process() = 0;
};//遗留接口(老接口)
class IAdaptee {public:virtual void foo(int data) = 0;virtual int bar() = 0;
};class OldClass : public IAdaptee {public:virtual void foo(int data) override {}virtual int bar() override {}
};class Adapter : public ITarget {protected:IAdaptee* pAdaptee
public:Adapter(IAdaptee* pAdaptee) {this->pAdaptee = pAdaptee;}virtual void process() override {int data = pAdaptee->bar();pAdaptee->foo(data);}
};int main() {IAdaptee* pAdaptee = new OldClass();ITarget* pTarget = new Adapter(pAdaptee);pTarget->process();
}
模式定义
将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。——《设计模式》GoF
要点总结
- Adapter模式主要应用于”希望复用一些现存的类,但是接口又与复用环境要求不一致的情况“,在遗留代码复用、类库迁移等方面非常有用。
- GoF 23定义了两种Adapter模式的实现结构:对象适配器和类适配器。但类适配器采用”多继承“的实现方式,一般不推荐使用。对象适配器采用”对象组合“的方式,更符合松耦合精神。
- Adapter模式可以实现的非常灵活,不必拘泥于GoF 23中定义的两种结构。例如,完全可以将Adapter模式中的”现存对象“作为新的接口方法参数,来达到适配的目的。
[大话设计模式C++版] 第17章 在NBA我需要翻译 —— 适配器模式相关推荐
- 《大话设计模式》之--第17章 在NBA我需要翻译----适配器模式
http://blog.csdn.net/monkey_d_meng/article/details/5707827 第17章 在NBA我需要翻译----适配器模式 17.1在NBA我需要翻译! 周日 ...
- [大话设计模式C++版] 第12章 牛市股票还会亏钱 —— 外观模式
源码可以在这里找到 大话设计模式C++版 股民炒股代码 //main.cpp #include <iostream>using namespace std;//股票1 class Stoc ...
- [大话设计模式C++版] 第14章 老板回来,我不知道 —— 观察者模式
源码可以在这里找到 大话设计模式C++版 双向耦合的代码 //Secretary.h 秘书类 #include <QList>using namespace std; class Stoc ...
- [大话设计模式C++版] 第13章 好菜每回味不同 —— 建造者模式
源码可以在这里找到 大话设计模式C++版 建造小人一 实现画小人的程序 //Widget.cpp void Widget::paintEvent(QPaintEvent *event) {QPaint ...
- 大话设计模式C++版——代理模式
本篇開始前先发个福利,程杰的<大话设计模式>一书高清电子版(带文件夹)已上传至CSDN,免积分下载. 下载地址:http://download.csdn.net/detail/gu ...
- 大话设计模式C++版——装饰模式
女人常说男人喜新厌旧.仅仅见新人笑,那闻旧人哭,但装饰模式(Decorator)却是一种结交新朋友不忘老朋友的设计模式,很适合去古代当老公(现代是不行的.由于仅仅能娶一个老婆了).装饰模 ...
- 信安教程第二版-第17章网络安全应急响应技术原理与应用
第17章 网络安全应急响应技术原理与应用 17.1 网络安全应急响应概述 353 17.1.1 网络安全应急响应概念 353 17.1.2 网络安全应急响应发展 353 17.1.3 网络安全应急响应 ...
- 《大话设计模式 C++版》
在我的资源有下载: 大话设计模式 C++ 设计模式分为三种类型,共23类. 创建型模式:单件模式.抽象工厂模式.建造者模式.工厂方法.原型模式. 结构型模式:适配器模式.桥接模式.装饰模式.组合模式. ...
- 17.在NBA我需要翻译-适配器模式(大话设计模式kotlin版)
适配器模式 基本概念 适配器:就是使得一个东西适合另外一个东西的东西. 定义:适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一 ...
最新文章
- windows xp开机音乐7秒_(老旧电脑的福音)win 10 ltsb2015开机只要7秒
- 极速理解设计模式系列:7.桥接模式(Bridge Pattern)
- “源代码中禁止显示”概述
- pandas where 用法
- mask rcnn算法原理图_基于MASK RCNN算法实现瑕疵图像识别(训练模型及应用)
- 密码学基础知识(一)信息安全与密码学
- 【面试经验分享】Java 面试中的那些潜规则
- 1. face_generate.py
- IO 模型知多少 | 代码篇
- 阿里云开源的Blink,计算能力很疯狂:一眨眼,全部都算好!
- Java框架数据库连接池比较(c3p0,dbcp和proxool)
- STM32F103单片机PWM单脉冲输出模式
- 数据结构Huffman树及编码
- linux usb bulk传输,2.1.1.2. USB MSC Bulk-Only (BBB) Transport
- LitePal 数据库使用方法(最新2.0LitePal数据库适用)
- 解决libc.so.6: version `GLIBC_2.14#39; not found问题
- IISPUT上传漏洞
- Wagtail SearchBackend —— ElasticSearch7 https 连接问题
- 实验室建立计量管理体系的重要性和意义
- Mac电脑网速慢的问题之一(硬件:MTU)
热门文章
- 什么人能成为Leader,大Leader该做什么
- Android Studio 之 实现app打开界面透明化效果
- 7.微信小程序做按比例截取图片
- 无线AP和无线路由器区别 wifi热点
- 全民wa矿小程序源码
- windows10安装keras教程
- 通过 TokenType(){}.getType()获取Persionlt;Tgt; 泛型T的类型和数值
- js 空数组直接赋值与push
- seaborn中sns.distplot图例显示方法及无法显示的解决办法
- JS--JS运行三部曲--渡一教育(视频笔记)