目录
一、基本概念
1.1 使用场景
适配器模式是一种结构型设计模式,主要作用是解决接口不兼容的问题。在STL中,适配器是六大组件之一,这六大组件包括容器、算法、迭代器、仿函数、适配器和空间适配器。适配器又可以细分为容器适配器、函数适配器和迭代器适配器。如statck、queue、dequeue、priority_queue等均可适配vector结合适当的算法操作即可实现这些数据结构。
在实际项目开发或重构中为了兼容老代码的功能和新代码重构的接口或风格等,老代码由于历史悠久或涉及面太广不便重构,此时使用适配器模式进行修改能很好的利用稳定的老代码逻辑,同时兼容新代码接口和风格。
1.2模式定义
将一个类的接口转换为客户希望的另一个接口,Adapter模式使得原本由于接口不兼容的类不能一起工作的类可以一起工作。
1.3适配器模式代码举例
//历史遗留的老接口或风格不符的第三方库接口
class Adaptee
{
public:
Adaptee() = default;
~Adaptee() = default;
int add(int a, int b)
{
return a + b;
}
int multuply(int a, int b)
{
return a * b;
}
};
//新接口
class Target
{
public:
Target() = default;
~Target() = default;
virtual int procNum(int a, int b) = 0;
};
//继承新接口 老接口对象组合
class Adapter:public Target
{
protected:
Adaptee* pAdaptee;//组合
public:
Adapter(Adaptee* pAdaptee) {
this->pAdaptee = pAdaptee;
}
int procNum(int a,int b) override{
int sum = pAdaptee->add(a,b);
return pAdaptee->multuply(sum,a);
}
~Adapter()
{
if (!pAdaptee)
{
delete pAdaptee;
}
}
};
二、项目中适配器模式的使用
在实际项目中有很多类似的使用场景,如在老代码中接入的各种LED、LCD、相机、扫码枪等等设备,在项目重构或者开放操作接口给第三方过程中需要按照新的接口提供给第三方,此时使用适配器模式很合适,一方面可以避免重新写复杂的设备代码逻辑避免设备接口的剧烈变动,另一方面解耦了业务代码与设备自身代码,提高了代码的可维护性。
三、总结
按照计算机里面的理论绝大部分问题均可以通过增加中间层进行解决,在实际的项目中一般剧烈变动的是业务代码,但是也有业务代码相对稳定但是底层的设备却随着时代发展型号和版本不断扩展升级,此时稳定的是设备业务功能,变动的是底层设备代码,因此可以针对稳定的业务功能设计稳定的接口,采用适配器模式接入不断扩展的设备,这样可以达到设备代码与业务接口的解耦合,提高代码的可维护性。