Adapter(适配器)模式
2011-02-12 11:13
260 查看
1. 意图
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容
而不能一起工作的那些类可以一起工作。
2. 结构
类适配器使用多重继承对一个接口与另一个接口进行匹配,如下图所示。
![](http://hi.csdn.net/attachment/201102/12/154836_1297479886Gm6L.jpg)
对象匹配器依赖于对象组合,如下图所示。
![](http://hi.csdn.net/attachment/201102/12/154836_1297479889NFlv.jpg)
3. 参与者
• Target
— 定义Client使用的与特定领域相关的接口。
• Client
— 与符合Ta rg e t接口的对象协同。
• Adaptee
— 定义一个已经存在的接口,这个接口需要适配。
• Adapter
— 对Adaptee的接口与Target接口进行适配
在Adapter模式的结构图中可以看到,类模式的Adapter采用继承的方式复用Adaptee的接口,而在对象模式的Adapter中我们则采用组合的方式实现Adaptee的复用。
4. 实现
(1). 类适配器
(2). 对象适配器
5. 代码说明
Adapter模式实现上比较简单,要说明的是在类模式Adapter中,我们通过private继承Adaptee获得实现继承的效果,而通过public继承Target获得接口继承的效果(有关实现继承和接口继承参见讨论部分)。
6. 讨论
在Adapter模式的两种模式中,有一个很重要的概念就是接口继承和实现继承的区别和联系。接口继承和实现继承是面向对象领域的两个重要的概念,接口继承指的是通过继承,子类获得了父类的接口,而实现继承指的是通过继承子类获得了父类的实现(并不统共接口)。在C++中的public继承既是接口继承又是实现继承,因为子类在继承了父类后既可以对外提供父类中的接口操作,又可以获得父类的接口实现。当然我们可以通过一定的方式和技术模拟单独的接口继承和实现继承,例如我们可以通过private继承获得实现继承的效果(private继承后,父类中的接口都变为private,当然只能是实现继承了。),通过纯抽象基类模拟接口继承的效果,但是在C++中pure virtual function也可以提供默认实现,因此这是不纯正的接口继承,但是在Java中我们可以interface来获得真正的接口继承了。
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容
而不能一起工作的那些类可以一起工作。
2. 结构
类适配器使用多重继承对一个接口与另一个接口进行匹配,如下图所示。
![](http://hi.csdn.net/attachment/201102/12/154836_1297479886Gm6L.jpg)
对象匹配器依赖于对象组合,如下图所示。
![](http://hi.csdn.net/attachment/201102/12/154836_1297479889NFlv.jpg)
3. 参与者
• Target
— 定义Client使用的与特定领域相关的接口。
• Client
— 与符合Ta rg e t接口的对象协同。
• Adaptee
— 定义一个已经存在的接口,这个接口需要适配。
• Adapter
— 对Adaptee的接口与Target接口进行适配
在Adapter模式的结构图中可以看到,类模式的Adapter采用继承的方式复用Adaptee的接口,而在对象模式的Adapter中我们则采用组合的方式实现Adaptee的复用。
4. 实现
(1). 类适配器
//类适配器使用多重继承对一个接口与另一个接口进行匹配 #include "stdafx.h" #include <iostream> using namespace std; class Target { public: Target(){} virtual ~Target(){} virtual void Request() { std::cout<<"Target::Request"<<std::endl; } protected: private: }; //定义一个已经存在的接口,这个接口需要适配 class Adaptee { public: Adaptee(){} ~Adaptee(){} void SpecificRequest() { std::cout<<"Adaptee::SpecificRequest"<<std::endl; } protected: private: }; //对Adaptee的接口与Target接口进行适配。 class Adapter: public Target, private Adaptee { public: Adapter(){} ~Adapter(){} void Request() { SpecificRequest(); } protected: private: }; int main(int argc,char* argv[]) { Target* adt = new Adapter(); adt->Request(); return 0; }
(2). 对象适配器
//对象匹配器信赖于对象组合 #include "stdafx.h" #include <iostream> using namespace std; class Target { public: Target(){} virtual ~Target(){} virtual void Request() { std::cout<<"Target::Request"<<std::endl; } protected: private: }; //定义一个已经存在的接口,这个接口需要适配 class Adaptee { public: Adaptee(){} ~Adaptee(){} void SpecificRequest() { std::cout<<"Adaptee::SpecificRequest"<<std::endl; } protected: private: }; //对Adaptee的接口与Target接口进行适配。 class Adapter:public Target { public: Adapter(Adaptee* ade) { _ade= ade; } ~Adapter() { } void Request() { _ade->SpecificRequest(); } protected: private: Adaptee* _ade; }; int main(int argc,char* argv[]) { Adaptee* ade = new Adaptee; Target* adt = new Adapter(ade); adt->Request(); return 0; }
5. 代码说明
Adapter模式实现上比较简单,要说明的是在类模式Adapter中,我们通过private继承Adaptee获得实现继承的效果,而通过public继承Target获得接口继承的效果(有关实现继承和接口继承参见讨论部分)。
6. 讨论
在Adapter模式的两种模式中,有一个很重要的概念就是接口继承和实现继承的区别和联系。接口继承和实现继承是面向对象领域的两个重要的概念,接口继承指的是通过继承,子类获得了父类的接口,而实现继承指的是通过继承子类获得了父类的实现(并不统共接口)。在C++中的public继承既是接口继承又是实现继承,因为子类在继承了父类后既可以对外提供父类中的接口操作,又可以获得父类的接口实现。当然我们可以通过一定的方式和技术模拟单独的接口继承和实现继承,例如我们可以通过private继承获得实现继承的效果(private继承后,父类中的接口都变为private,当然只能是实现继承了。),通过纯抽象基类模拟接口继承的效果,但是在C++中pure virtual function也可以提供默认实现,因此这是不纯正的接口继承,但是在Java中我们可以interface来获得真正的接口继承了。
相关文章推荐
- Java设计模式——Adapter(适配器)模式
- Java23种设计模式--Adapter(适配器)
- 设计模式--适配器(Adapter)
- 设计模式 适配器(Adapter)模式
- 设计模式之适配器(Adapter)模式
- Java设计模式透析之 —— 适配器(Adapter)
- Java设计模式(2)Adapter模式 加个“适配器”以便于复用
- 设计模式之Adapter(适配器)
- 设计模式之适配器Adapter
- JAVA设计模式(18) —适配器(Adapter)模式
- 七、结构模式之-适配器(Adapter)模式
- 我的设计模式-适配器(Adapter)
- 面向对象:适配器(Adapter)模式
- Android自定义账户类型和同步适配器模式 Custom Account Type & SyncAdapter
- 适配器(Adapter)模式
- SqlDataAdapter适配器的用法(ADO.NET无连接模式访问数据库)
- 设计模式--适配器(Adapter)
- 设计模式之适配器-Adapter
- Java设计模式透析之 —— 适配器(Adapter)
- 设计模式之Adapter模式(适配器)