适用场景
适配器模式在实际项目中常见于以下两种情形。
- 情景一:项目中引入的第三方库接口与本程序既有接口不一致,为了让两者协同工作,需要一个中间层把差异屏蔽掉,这时就可以使用适配器模式。
- 情景二:某个功能需要由多个互不相关的模块组合而成,通过适配器把它们整合到同一个接口之下,调用方只需面对统一的抽象。
两种实现方式
适配器模式在实现上分为两种类别:类模式和对象模式。
- 类模式:通过继承的方式来复用 Adaptee。
- 对象模式:通过组合的方式来复用 Adaptee。
结构示意
C++ 示例代码
下面的示例同时演示了类模式(Adapter)和对象模式(Adapter1)两种实现。Target 是调用方期望的目标接口,Adaptee 是需要被适配的既有类。
class Target
{
public:
virtual void Request()
{
}
};
class Adaptee
{
public:
void SpecificRequest()
{
cout << __FUNCTION__ << endl;
}
};
// 类模式
class Adapter :public Target, public Adaptee
{
public:
void Request()override
{
Adaptee::SpecificRequest();
}
};
// 对象模式
class Adapter1 :public Target
{
public:
void Request()override
{
adaptee.SpecificRequest();
}
private:
Adaptee adaptee;
};
int main(int argc, char *argv[])
{
Target * target = new Adapter1;
target->Request();
system("pause");
return 0;
}