设计模式---接口隔离模式之适配器模式(Adapter)
一:概念
通过Adapter模式可以改变已有类(或外部类)的接口形式
二:动机
在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。
如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?
生活中如电源适配器,vga转换线等,适配器模式可以通过将旧的类接口转化为新接口,从而解决新环境要求的接口问题。
三:模式定义
将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
--《设计模式》Gof
四:类图(结构)

五:代码讲解
//目标接口(新接口)
class ITarget{
public:
virtual void process()=;
}; //遗留接口(老接口)
class IAdaptee{
public:
virtual void foo(int data)=;
virtual int bar()=;
}; //遗留类型,符合老的接口
class OldClass: public IAdaptee{
//....
}; //对象适配器
class Adapter: public ITarget{ //继承
protected:
IAdaptee* pAdaptee;//组合 public: Adapter(IAdaptee* pAdaptee){
this->pAdaptee=pAdaptee;
} virtual void process(){
int data=pAdaptee->bar();
pAdaptee->foo(data); }
};
int main(){
    IAdaptee* pAdaptee=new OldClass();
    ITarget* pTarget=new Adapter(pAdaptee);
    pTarget->process();
}
接口转换,将目标接口转目的接口,不一定是旧的旧和新,例如栈和队列转换,本身即是接口又是实现。
class stack{  //没有组合,没有指针,即是接口又是实现
    deqeue container;
};
class queue{
    deqeue container;
};
六:要点总结
(一)Adapter模式主要应用于“希望复用一些现存的类,但是接口又与服用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用。
(二)GoF23定义了两种Adapter模式的结构实现:对象适配器和类适配器。但类适配器采用“多继承”的实现方式,一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合的精神。
1.对象适配器
//对象适配器
class Adapter: public ITarget{ //继承
protected:
IAdaptee* pAdaptee;//组合,灵活性高 public: Adapter(IAdaptee* pAdaptee){
this->pAdaptee=pAdaptee;
} virtual void process(){
int data=pAdaptee->bar();
pAdaptee->foo(data); }
};
一个继承一个组合,就叫做对象适配器:因为他是通过组合对象来实现适配的
2.类适配器(不太好,用的很少,坏处更多)
//类适配器
class Adapter: public ITarget,
protected OldClass{ //多继承,定死了,灵活性不高
}
通过多继承来实现类适配器,public继承是共有接口,我符合你的接口规范,protected和private继承是实现继承,并没有继承你的接口,但是我用你的实现
(三)Adapter模式可以实现的非常灵活,不必拘泥于GoF23中定义的两种结构。例如,完全可以将Adapter模式中的“现存对象”作为新的接口方法参数,来达到适配的目的。
七:案例实现:电压转换18-220v
class Current18V
{
public:
virtual void use18vCurrent()
{
cout << "use 18v voltage" << endl;
}
}; class Current220V
{
public:
void use220vCurrent()
{
cout << "use 220v voltage" << endl;
}
};
//继承接口规范,组合数据
class Adapter :public Current18V
{
private:
Current220V* cur;
public:
Adapter(Current220V* c) :cur(c)
{
} virtual void use18vCurrent()
{
cout << "adapter use voltage" << endl;
cur->use220vCurrent();
}
};
void main()
{
Current220V* c2 = new Current220V();
Adapter* adapter = new Adapter(c2);
adapter->use18vCurrent(); delete c2;
delete adapter; system("pause");
return;
}

设计模式---接口隔离模式之适配器模式(Adapter)的更多相关文章
- 设计模式---接口隔离模式之门面模式(Façade)
		
前提:接口隔离模式 在组建构建过程中,某些接口之间直接的依赖常常会带来很多问题.甚至根本无法实现.采用添加一层间接接口(稳定的),来隔离本来相互紧密关联的接口是一种常见的解决方案. 典型模式: 门面模 ...
 - 设计模式---接口隔离模式之中介者模式(Mediator)
		
一:概念 在Mediator模式中,类之间的交互行为被统一放在Mediator的对象中,对象通过Mediator对象同其他对象交互.Mediator对象起到控制器的作用 二:动机 在软件构建的过程中, ...
 - 设计模式---接口隔离模式之代理模式(Proxy)
		
一:概念 代理模式(Proxy Pattern)就是为其他对象提供一种代理以控制对这个对象的访问. 比如: 智能指针 为别人做嫁衣 所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端 ...
 - 设计模式---结构型模式之适配器模式(Adapter Pattern)
		
适配器模式定义 将一个类的接口,转换成客户期望的另外一个接口.适配器让原本接口不兼容的类可以合作无间. 适配器模式主要有两种类型:对象适配器和类适配器. 在详细解释这两种类型时,解释部分重要角色.生活 ...
 - C++设计模式 之 “接口隔离” 模式:Facade、Proxy、Mediator、Adapter
		
“接口隔离”模式 在组建构建过程中,某些接口之间之间的依赖常常会带来很多问题.甚至根本无法实现.采用添加一层间接(稳定)接口,来隔离本来相互紧密关联的接口是一种常见的解决方案. 典型模式 #Facad ...
 - 23种设计模式 - 接口隔离(Facade - Proxy - Mediator - Adapter)
		
其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 接口隔离 在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题.甚至根本无法实现.采用添加一层间接( ...
 - 七个结构模式之适配器模式(Adapter Pattern)
		
定义: 将一个接口转换为客户需要的另外一个接口,使接口不兼容的类型可以一起工作,也被称为包装器模式(Wrapper Patern). 结构图: Target:目标抽象类,客户所需要的接口. Adapt ...
 - 设计模式 第一天 UML图,设计模式原则:开闭原则、依赖倒转原则、接口隔离原则、合成复用原则、迪米特法则,简单工厂模式
		
1 课程大纲 2 UML的概述 总结: UML unified model language 统一建模语言 一共有十种图: 类图 用例图 时序图 * 对象图 包图 组件图 部署图 协作图 状态图 (最 ...
 - 设计模式(五)适配器模式Adapter(结构型)
		
设计模式(五)适配器模式Adapter(结构型) 1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相 ...
 
随机推荐
- MD5进行加密操作
			
package com.dyy.test; import java.security.MessageDigest; import java.security.NoSuchAlgorithmExcept ...
 - 微信小程序——使用vue构建小程序【外传】
			
文档 http://mpvue.com/mpvue/ 根据文档构建完成的页面如下 更多的,还要继续看下文档~
 - HDU4460-Friend Chains-BFS+bitset优化
			
bfs的时候用bitset优化一下. 水题 #include <cstdio> #include <cstring> #include <algorithm> #i ...
 - Codeforces1037G A Game on Strings 【SG函数】【区间DP】
			
题目分析: 一开始没想到SG函数,其它想到了就开始敲,后来发现不对才发现了需要SG函数. 把每个字母单独提出来,可以发现有用的区间只有两个字母之间的区间和一个位置到另一个字母的不跨越另一个相同字母的位 ...
 - GIL、进/线程池、同/异步、阻/非阻塞
			
1 GIL:全局解释器锁 GIL本质就是一把互斥锁,是夹在解释器身上的, 同一个进程内的所有线程都需要先抢到GIL锁,才能执行解释器代码 2.GIL的优缺点: 优点: 保证Cpython解释器内存管理 ...
 - 【BZOJ3992】【SDOI2015】序列统计 原根 NTT
			
题目大意 有一个集合\(s\),里面的每个数都\(\geq0\)且\(<m\). 问有多少个长度为\(n\)的数列满足这个数列所有数的乘积模\(m\)为\(x\).答案模\(1004535809 ...
 - 【cf789B】Masha and geometric depression(分类讨论/暴力)
			
B. Masha and geometric depression 题意 在黑板上写数列,首项是b,公比是q,超过l时就停止不写.给定m个数,遇到后跳过不写.问一共写多少个数,如果无穷个输出inf. ...
 - luogu5022 [NOIp2018]旅行 (dfs)
			
m=n-1的时候,就直接贪心地dfs就可以 m=n的话,就可以枚举删掉一条边,然后照着m=n-1做 $O(n^2)$大概能过 (然而我眼瞎看不到m<=n) #include<cstdio& ...
 - kafka集群图形界面管理工具kafka-manager
			
应用说明: 图形web相对于命令行很多时候显得更直观,kafka-manager是yahoo开源出来的项目,web界面还挺好用,安装更是很便捷. 安装环境: 具体安装: 1. 下载已经编译好的zip包 ...
 - QML学习笔记(四)-TabView-竖直方向
			
源码:https://github.com/sueRimn/QML-ExampleDemos 作者: 狐狸家的鱼 Github: 八至 版权声明:如需转载请获取授权和联系作者 想实现垂直竖直方向的Ta ...