定义
适配器模式,将一个类的接口转换成客户希望的另外一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
结构图
例子
//Target类,这是客户所期待的接口,目标可以是具体的类或者抽象的类,也可以是接口。
class Target
{
public:
virtual void Request() = 0;
}
//需要适配的类
class Adaptee
{
public:
void SpecificRequest();
}
//通过在内部包装一个Adaptee对象,把源接口转换为目标接口。
class Adapter : public Target
{
private:
Adaptee adaptee = new Adaptee();
public:
void Request()
{
adaptee.SpecificRequest();
}
}
//客户端代码
void main()
{
Target target = new Adapter();
target.Request();
}
适用场景
- 使用一个已经存在的类,但如果它的接口,也就是它的方法和你的要求不相同时,就应该考虑使用适配器模式。
- 两个类所做的事情相同或者相似,但是具有不同的接口时要使用它。
- 客户代码可以统一调用同一个接口
- 双方都不太容易修改的时候再使用适配器模式适配。
特点
- Adapter模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用。
- Adapter模式有对象适配器和类适配器两种形式的实现结构,但是类适配器采用“多继承”的实现方式,带来了不良的高耦合,所以一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合精神。
- Adapter模式的实现可以非常的灵活,不必拘泥于GOF23中定义的两种结构。例如,完全可以将Adapter模式中的“现存对象”作为新的接口方法参数,来达到适配的目的。
- Adapter模式本身要求我们尽可能地使用“面向接口的编程”风格,这样才能在后期很方便的适配。