适配器模式(Adapter)
作用:
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适配器模式分为两种:
- 类适配器模式;
- 对象适配器模式;
在对象适配器模式结构图中包含如下几个角色:
- Target(目标抽象类):目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类;
- Adapter(适配器类):适配器可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配,适配器类是适配器模式的核心,在对象适配器中,它通过继承Target并关联一个Adaptee对象使二者产生联系;
- Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下可能没有适配者类的源代码;
以下情况可以选择适配器:
- 系统的数据和行为都正确,但接口不符时,我们应该考虑使用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况;
- 想使用一个已经存在的类,但如果它的接口,也就是它的方法和你的要求不相同时,就应该考虑用适配器模式;
- 比如购买的第三方开发组件,该组件接口与我们自己系统的接口不相同,或者由于某种原因无法直接调用该组件,可以考虑适配器;
【笔者想法】
所谓的适配器模式,其实可以用多重继承来解释,在继承中调用另一个类的方法。
示例:三插头转到两插头使用
// Cplus_study.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
class twoOutlets {
public:
void doTwoOutlets() { cout << "do some thing with twoOutlets\n"; }
};
class threeOutlets {
public:
virtual void doThreeOutlets() { cout << "do some thing with threeOutlets\n"; }
};
//类模式
class Adapter :public twoOutlets, public threeOutlets {
public:
Adapter() {}
void doThreeOutlets() { doTwoOutlets(); }
};
//对象模式
class Adapter1 :public threeOutlets {
public:
Adapter1(twoOutlets* t) :to(t) {}
void doThreeOutlets() { to->doTwoOutlets(); }
private:
twoOutlets* to;
};
int main()
{
//类模式
threeOutlets* to = new Adapter();
to->doThreeOutlets();
//对象模式
threeOutlets* th = new Adapter1(new twoOutlets());
th->doThreeOutlets();
system("pause");
return 0;
}
结果:
参考