设计模式【六】:适配器
伪代码
//被适配的类
class Adaptee{
public:
Adaptee();
void adapteeMethod();
}
//目标类,期望通过调用目标类的方法以调用被适配类的方法
class Target{
public:
Target();
void targetMethod();
}
//类适配器,通过继承适配。公共继承接口,私有继承被适配类
class Adapter1: public Target, private Adaptee{
public:
Adapter1();
void targetMethod(){
return Adaptee::adapteeMethod();
}
}
//对象适配器,通过对象组合适配
class Adapter2: public Target{
public:
Adapter(Adaptee* adaptee){
_adaptee = adaptee;
}
void targetMethod(){
return _adaptee->adapteeMethod();
}
private:
Adaptee* _adaptee;
}
优缺点
优点
- 类适配器
- 适配器可override被适配者的方法。
- 只引入一个额外对象,且没有指针重定向。
- 对象适配器
- 一个适配器可以适配多个被适配者(多维护几个指针即可)。
缺点
- 类适配器
- 类适配是实体类。这限制了可扩展性。
- 对象适配器
- 由于通过指针适配,需要考虑被适配者的子类。严格来说这不算缺点,这是个特点。
何时使用
有时一些类(一般是工具类)的方法仅仅因为签名不符就不能用了。此时可以使用适配器套壳。
实现时技巧
- 考虑需要多少组适配,以便在两种适配器中做选择。
- 可以采用内嵌的适配器,也就是在被适配者内部套壳。
- 牢记:适配器一定是目标接口的子类。