适配器模式
什么是适配器模式
适配器模式是将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。好比日本现在就只提供110V的电压,而我的电脑就需要220V的电压,那怎么办啦?适配器就是干这活的,在不兼容的东西之间搭建一座桥梁,让二者能很好的兼容在一起工作。
为什么使用适配器模式
在软件开发中,有的时候系统的数据和行为都正确,但接口不符合,我们应该考虑使用适配器模式,目的是使控制范围之外的一个原有对象与某个接口匹配。举个例子:在开发一个模块的时候,有一个功能点实现起来比较费劲,但是,之前有一个项目的模块实现了一样的功能点;但是现在这个模块的接口和之前的那个模块的接口是不一致的。此时,作为项目经理的你,该怎么办啦?使用适配器模式,将之前实现的功能点适配进新的项目了。
适配器模式实现步骤
-
适配器实现与其中一个现有对象兼容的接口
-
现有对象可以使用该接口安全地调用适配器方法
-
适配器方法被调用后将以另一个对象兼容的格式和顺序将请求传递给该对象
一般适配器模式分为以下两类:
-
对象适配器:适配器实现了其中一个对象的接口, 并对另一个对象进行封装
对象适配器实现代码
//电源插座 三插头到两插头转换
#include <iostream>
using namespace std;
class ThreeOutlet {
public:
void ThreeOutletCharge() { cout << "开始三插座充电......" << endl; }
};
class AbstractTwoOutlet {
public:
virtual void TwoOutletCharge() = 0;
};
class TwoOutlet : public TwoOutlet {
public:
void TwoOutletCharge() { cout << "开始二插座充电......" << endl; }
};
//对象适配器
class OutletAdapterObject : public AbstractTwoOutlet {
public:
OutletAdapterObject(ThreeOutlet* out) { pOut = out; }
void TwoOutletCharge() {
Convertor();
pOut->ThreeOutletCharge();
}
void Convertor() { cout << "三插头转换为两插头后:"; }
ThreeOutlet* pOut;
};
int main() {
ThreeOutlet* pThree = new ThreeOutlet;
AbstractTwoOutlet* pTwo = new OutletAdapterObject(pThree);
pTwo->TwoOutletCharge();
return 0;
}
类适配器实现代码:
#include <iostream>
using namespace std;
class ThreeOutlet {
public:
void ThreeOutletCharge() { cout << "开始三插座充电......" << endl; }
};
class AbstractTwoOutlet {
public:
virtual void TwoOutletCharge() = 0;
};
class TwoOutlet : public TwoOutlet {
public:
void TwoOutletCharge() { cout << "开始二插座充电......" << endl; }
};
//类适配器模式
class OutletAdapterClass : public AbstractTwoOutlet, public ThreeOutlet {
public:
void TwoOutletCharge() {
Convertor();
ThreeOutletCharge();
}
void Convertor() { cout << "三插头转换为两插头后:"; }
};
int main() {
ThreeOutlet* pThree = new ThreeOutlet;
AbstractTwoOutlet* pTwo = new OutletAdapterClass;
pTwo->TwoOutletCharge();
return 0;
}
适配器模式优缺点
优点
-
降低了去实现一个功能点的难度,可以对现有的类进行包装,就可以进行使用了
-
提高了项目质量,现有的类一般都是经过测试的,使用了适配器模式之后,不需要对旧的类进行全面的覆盖测试;
-
总的来说,提高了效率,降低了成本。
缺点
-
类适配器模式,由于多继承,可能会出现二义性
-
对象适配器模式,如果过多使用适配器模式,会导致代码阅读难度增大