大话设计模式C++ 适配器模式
适配器模式:将一个类的接口转换成客户希望的另外一个接口。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++ 适配器模式的更多相关文章
- java 之 适配器模式(大话设计模式)
适配器模式,笔者不是很推荐在项目初期阶段使用,在笔者看来这个设计模式就是套接了一层,从而达到能够迎合现有的外部接口规范. 先来简单的看下类图: 大话设计模式-类图 这个模式理解起来非常简单,A→B因为 ...
- linkin大话设计模式--适配器模式
linkin大话设计模式--适配器模式 大家知道,在java中只允许单继承,但是在实际问题中往往都需要多继承,java引入了接口这一概念.(一个类可以实现多个接口) 由于接口中都是抽象方法,那么我们在 ...
- 大话设计模式Python实现-适配器模式
适配器模式(Adapter Pattern):将一个类的接口转换成为客户希望的另外一个接口. 下面是一个适配器模式的demo: #!/usr/bin/env python # -*- coding:u ...
- <大话设计模式>笔记
读完了<大话设计模式>这本书,收获很多,对程序设计有了很多新的理解.将每章模式的大概要点做了些笔记以备查阅,一些设计模式书读完也对其了解得不是很透彻,需要以后在实践中来不断地加深理解吧.读 ...
- linkin大话设计模式--常用模式总结
linkin大话设计模式--常用模式总结 一,常用设计模式定义 Abstract Factory(抽象工厂模式):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. Adapter( ...
- Java进阶篇设计模式之四 -----适配器模式和桥接模式
前言 在上一篇中我们学习了创建型模式的建造者模式和原型模式.本篇则来学习下结构型模式的适配器模式和桥接模式. 适配器模式 简介 适配器模式是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型 ...
- Java设计模式之四 ----- 适配器模式和桥接模式
前言 在上一篇中我们学习了创建型模式的建造者模式和原型模式.本篇则来学习下结构型模式的适配器模式和桥接模式. 适配器模式 简介 适配器模式是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型 ...
- 【Python】《大话设计模式》Python版代码实现
<大话设计模式>Python版代码实现 上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼 ...
- 大话设计模式--Python
作者:五岳 出处:http://www.cnblogs.com/wuyuegb2312 上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一 ...
随机推荐
- idhttp与cookie
用关键词“idhttp cookie”在各大搜索引擎得到的结果,大多千篇一律,如果你搜索到这一篇,恭喜你,你有福了. 以下内容测试环境:delphi2007, winxp sp3, indy10. ...
- 转:jquery的$(function(){})和$(document).ready(function(){}) 的区别
原文链接:https://www.cnblogs.com/slyzly/articles/7809935.html [转载]jquery的$(function(){})和$(document).rea ...
- 如何在Win10上永久禁用Windows Defender Antivirus
1.使用Windows键+ R键盘快捷键打开运行命令. 2.键入regedit,然后单击确定以打开注册表. 3.浏览以下路径: HKEY_LOCAL_MACHINE/SOFTWARE/Policies ...
- jvm的调优
首先我们要知道jvm的调优,主要是对那些部分的优化.通过jvm内存模型我们可以,首先是分析遇到的问题,然后通过一些工具或者手段找到问题所在,然后通过一定的措施解决问题,下面我们也将按着这个思路来给出具 ...
- jquery重置表单
表单一般都有重置功能,在重置表单时需要将各个输入框中的值清空,如果输入框比较多,一个一个清空会比较麻烦,使用jquery的方法直接将表单中的所有输入框全部清空,首先给出一个form表单: <fo ...
- (4.26)sql server存储过程优化
此博客介绍了简单但有用的提示和优化,以提高存储过程的性能. 0.with recompile:重编译 exec uspGetSalesInfoForDateRange ‘1/1/2009’, 31/1 ...
- 004-Quartz存储与持久化-基于quartz.properties的配置
一.概述 Quartz提供两种基本作业存储类型.第一种类型叫做RAMJobStore,第二种类型叫做JDBC作业存储.在默认情况下Quartz将任务调度的运行信息保存在内存中,这种方法提供了最佳的性能 ...
- 敏捷开发— —Scrum 学习笔记
敏捷开发模式是一种从1990年代开始逐渐引起广泛关注的一些新型软件开发方法,是一种应对快速变化的需求的一种软件开发能力.它们的具体名称.理念.过程.术语都不尽相同,相对于"非敏捷" ...
- 微信小程序 - 表单验证插件WxValidate使用
插件下载地址及官方文档:https://github.com/skyvow/wx-extend 具体的WxValidate.js文件的位置在wx-extend/src/assets/plugins/w ...
- POJ1611:The Suspects(模板题)
http://poj.org/problem?id=1611 Description Severe acute respiratory syndrome (SARS), an atypical pne ...