适配器模式:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原来由于接口不兼容而不能一起工作的那些类可以一起工作。

角色:

(1)Target:这是客户所期待的接口,Target可以是具体的或抽象的类,也可以是接口。

(2)Adaptee:需要适配的类。

(3)Adapter:通过在内部包装一个Adaptee对象,把源接口转换成目标接口。

Client需要Request()函数,Adaptee提供的是SpecificRequest()函数,Adapter提供一个Request()函数将Adaptee和SpecificeRequest()函数封装起来。

什么时候用?

(1)在想使用一个已存在的类,但是如果他的接口,也就是它的方法和你的要求不相同时,就应该考虑用适配器模式。

(2)用了适配器模式,客户代码可以统一调用统一接口就行了,这样可以更简单,更直接,更紧凑。

(3)要在双方都不太容易修改的时候再使用适配器模式适配,而不是一有不同是就使用它。

 #include <iostream>
#include <cstdlib>
#include<string> using namespace std; //Target,此处为运动员
class Player
{
protected:
std::string name;
public:
Player(std::string name)
{
this->name = name;
}
virtual void Attack() = ;
virtual void Defense() = ;
}; //下面是普通的 接口和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;
}
}; //Adaptee,此处为外籍中锋,它的接口和Target的接口不一样,需要翻译来帮忙转换
class ForeignPlayerCenter
{
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,此处为翻译 ,将 ForeignPlayerCenter 与player 一致的接口
class Translator :public Player
{
private:
ForeignPlayerCenter* wjzf;
public:
Translator(std::string name) :Player(name)
{
wjzf = new ForeignPlayerCenter;
wjzf->setName(name);
}
~Translator()
{
delete wjzf;
}
void Attack()
{
wjzf->ForeignAttack();
} void Defense()
{
wjzf->ForeignDefense();
}
}; //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");
}

https://blog.csdn.net/xiqingnian/article/details/42061705

https://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/adapter.html

大话设计模式C++ 适配器模式的更多相关文章

  1. java 之 适配器模式(大话设计模式)

    适配器模式,笔者不是很推荐在项目初期阶段使用,在笔者看来这个设计模式就是套接了一层,从而达到能够迎合现有的外部接口规范. 先来简单的看下类图: 大话设计模式-类图 这个模式理解起来非常简单,A→B因为 ...

  2. linkin大话设计模式--适配器模式

    linkin大话设计模式--适配器模式 大家知道,在java中只允许单继承,但是在实际问题中往往都需要多继承,java引入了接口这一概念.(一个类可以实现多个接口) 由于接口中都是抽象方法,那么我们在 ...

  3. 大话设计模式Python实现-适配器模式

    适配器模式(Adapter Pattern):将一个类的接口转换成为客户希望的另外一个接口. 下面是一个适配器模式的demo: #!/usr/bin/env python # -*- coding:u ...

  4. <大话设计模式>笔记

    读完了<大话设计模式>这本书,收获很多,对程序设计有了很多新的理解.将每章模式的大概要点做了些笔记以备查阅,一些设计模式书读完也对其了解得不是很透彻,需要以后在实践中来不断地加深理解吧.读 ...

  5. linkin大话设计模式--常用模式总结

    linkin大话设计模式--常用模式总结 一,常用设计模式定义 Abstract Factory(抽象工厂模式):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. Adapter( ...

  6. Java进阶篇设计模式之四 -----适配器模式和桥接模式

    前言 在上一篇中我们学习了创建型模式的建造者模式和原型模式.本篇则来学习下结构型模式的适配器模式和桥接模式. 适配器模式 简介 适配器模式是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型 ...

  7. Java设计模式之四 ----- 适配器模式和桥接模式

    前言 在上一篇中我们学习了创建型模式的建造者模式和原型模式.本篇则来学习下结构型模式的适配器模式和桥接模式. 适配器模式 简介 适配器模式是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型 ...

  8. 【Python】《大话设计模式》Python版代码实现

    <大话设计模式>Python版代码实现 上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼 ...

  9. 大话设计模式--Python

    作者:五岳 出处:http://www.cnblogs.com/wuyuegb2312 上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一 ...

随机推荐

  1. [filesystem][archlinux][disk encryption][btrfs] btrfs

    fork from here http://www.cnblogs.com/hugetong/p/6914248.html boot分区,MBR加密:https://wiki.archlinux.or ...

  2. 上传本地代码到github&&从github下载源码

    最近在玩github,下面简单介绍下githup的使用 将本地代码同步到github. 使用Git GUI同步  1,先下载git,然后安装.右键如图所示. 2,在github里新建一个 reposi ...

  3. 我的grunt学习笔记

    什么是grunt?  Grunt是一个JavaScript任务运行器,用于自动执行频繁任务(如压缩,编译,单元测试)的工具.它使用命令行界面来运行在文件中定义的自定义任务(这个文件称为Gruntfil ...

  4. python摸爬滚打之day01----初识Python

    1.编程语言分类 编译型语言:程序被一次性全部翻译成机器语言,计算机直接以机器语⾔言来运⾏行行此程序. 优点:运行效率高,可脱离语言环境独立运行. 缺点:开发效率低,可移植性差. 解释型语言:将程序逐 ...

  5. 洛谷P5234 越狱老虎桥 [JSOI2012] tarjan

    正解:tarjan+贪心(?并不会总结是什么方法QAQ,,, 解题报告: 传送门! 这题是真的题意杀,,,我我我要不是之前知道题目大意了我怕是怎么看都看不懂这是个什么意思昂QAQ 所以先说下题目大意好 ...

  6. 如何调用finecms指定栏目的描述关键词

    有时我们在用finecms建站时需要调用指定栏目的描述和关键词,实现个性化需求,比如id为23的栏目很重要,要让它在首页展示出来,这时我们要如何调用呢?{dr_cat_value(23, 'name' ...

  7. Python3学习之路~5.1 模块介绍

    1 定义 模块:用来从逻辑上组织Python代码(变量.函数.类.逻辑:实现一个功能),本质上就是.py结尾的Python文件(文件名:test.py对应的模块名:test). 2 导入方法 impo ...

  8. jmeter测试文件上传接口报错:connection reset by peer: socket write error

    最近在对文件上传接口性能测试时,设置150线程数并发时,总会出现以下错误:connection reset by peer: socket write error 在网上搜索了一下,得到的原因有这些: ...

  9. GUI库之认识Tkinter(一)

    一.介绍 Tkinter是Python默认的GUI库,我们经常使用的IDLE就是用Tkinter设计出来的,因此我们在使用的时候直接导入Tkinter模块就好了. 1.特点:可移植性.灵活性高 2.构 ...

  10. 显示日历的指令:cal

    1.显示日历的指令:cal (1)参数: (2)实例: