适配器模式属于结构型的设计模式,它是结构型设计模式之首(用的最多的结构型设计模式)。
适配器设计模式也并不复杂,适配器它是主要作用是将一个类的接口转换成客户希望的另外一个接口这样使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式有两种:1.类的适配器 2.对象适配器,对象适配器更多一些。
类适配器:
由图中可以看出,Adaptee类没有Request方法,而客户期待这个方法。为了使客户能够使用Adaptee类,提供一个中间环节,即类Adapter类,Adapter类实现了Target接口,并继承自Adaptee,Adapter类的Request方法重新封装了Adaptee的SpecificRequest方法,实现了适配的目的。
因为Adapter与Adaptee是继承的关系,所以这决定了这个适配器模式是类的。
该适配器模式所涉及的角色包括:
目标(Target)角色:这是客户所期待的接口。因为C#不支持多继承,所以Target必须是接口,不可以是类。
源(Adaptee)角色:需要适配的类。
适配器(Adapter)角色:把源接口转换成目标接口。这一角色必须是类
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
//5v电压的类
/*
class V5
{
public:
void useV5() {
cout << "使用了5v的电压" << endl;
}
};
*/
class V5
{
public:
virtual void useV5() = 0;
};
//目前只有v220的类 没有v5
class V220
{
public:
void useV220() {
cout << "使用了220v的电压" << endl;
}
};
//定义一个中间的适配器类
class Adapter :public V5
{
public:
Adapter(V220 * v220)
{
this->v220 = v220;
}
~Adapter() {
if (this->v220 != NULL) {
delete this->v220;
}
}
virtual void useV5() {
v220->useV220(); //调用需要另外的方法
}
private:
V220 *v220;
};
class iPhone
{
public:
iPhone(V5 *v5)
{
this->v5 = v5;
}
~iPhone()
{
if (this->v5 != NULL) {
delete this->v5;
}
}
//充电的方法
void charge()
{
cout << "iphone手机进行了充电" << endl;
v5->useV5();
}
private:
V5*v5;
};
int main(void)
{
iPhone *phone = new iPhone(new Adapter(new V220));
phone->charge();
return 0;
}