-
适配器模式:一种结构型设计模式
-
应用场景:
类A中想要写一个很复杂的新方法,但是该方法已经在类B中实现过了,如果重复写一次,代码量会增加很多而且代码可读性会降低
举例:
我国的市电电压是220V,但很多电器正常工作所需的电压是5V。如果为了电器使用而改变市电的电压,工程会变得很大,而且不同的电器所需的电压各不同,配合电器需求而更改市电电压显然是不现实的,所以电器都会配备一个适配器,将市电的220V转换成自己所需的电压 -
实现方式:
实现方式有两种。
第一种,类适配器,使用多继承的方式
类A继承自类B,即可直接调用类B实现过的方法,无需重复写一次该方法
第二种,对象适配器,使用组合的方式
类A中增加一个类B的指针,在类A的新方法中,调用类B中已实现的方法 -
优点:
无需重复实现与测试新方法,提高了效率 -
缺点:
类适配器模式,由于多继承,可能会出现二义性
对象适配器模式,如果过多使用适配器模式,会导致代码阅读难度增大
以下是类适配器模式的简单代码实现
#include <iostream>
using namespace std;
//市电类
class Electricity
{
public:
virtual void Charge()//使用市电进行充电,输出验证电压的数值
{
cout << "220V charging..." << endl;
}
};
//适配器类
class Adapter5V
{
public:
void Transfer()//将电压转换为5V,输出验证
{
cout << "5V charging..." << endl;
}
};
//类适配器,使用多继承的方式
class ElecWithAdapter5V:public Electricity, Adapter5V
{
public:
virtual void Charge()//重写充电方法
{
Transfer();//直接调用适配器电压转换方法
}
};
主函数中的使用
#include <iostream>
#include "ClassAdapter.h"
using namespace std;
int main()
{
Electricity* pEle = new Electricity();//如果不使用适配器
pEle->Charge();
Electricity* pEleWithAdapter = new ElecWithAdapter5V();//使用适配器
pEleWithAdapter->Charge();
return 0;
}
控制台输出结果
220V charging...
5V charging...
以下是对象适配器模式的简单代码实现
#include <iostream>
using namespace std;
//市电类
class Electricity
{
public:
virtual void Charge()//使用市电进行充电,输出验证电压的数值
{
cout << "220V charging..." << endl;
}
};
//适配器类
class Adapter5V
{
public:
void Transfer()//将电压转换为5V,输出验证
{
cout << "5V charging..." << endl;
}
};
//对象适配器
class ElecWithAdapter5V:public Electricity
{
public:
ElecWithAdapter5V():pAdapter(NULL)
{
pAdapter = new Adapter5V();
}
virtual void Charge()//重写充电方法
{
pAdapter->Transfer();//通过适配器指针,调用电压转换方法
}
private:
Adapter5V* pAdapter;
};
主函数中的使用
#include <iostream>
#include "ObjectAdapter.h"
using namespace std;
int main()
{
Electricity* pEle = new Electricity();//如果不使用适配器
pEle->Charge();
Electricity* pEleWithAdapter = new ElecWithAdapter5V();//使用适配器
pEleWithAdapter->Charge();
return 0;
}
控制台输出结果
220V charging...
5V charging...
如有错误,欢迎指正
网友评论