类似于生活中的电源适配器,把220V的电压转为低压供小电器使用。适配器模式的意图是在不改变原本类设计的情况下提供一个新的接口,达到代码复用的作用。适配器模式分为类模式和对象模式。类模式用私有继承的方式实现,对象模式则是将已存在的接口类作为对象添加到新类当中。比较起来类模式不需要额外的指针维护,但是不能适用于接口类的子类,而对象模式模式则较为灵活,通过一个基类的指针对象可以匹配多个接口类(接口类直接有继承关系)。
考虑一个图形编辑器,图元基类为shape,相应的有派生于该类的直线类lineshape,多边形类polygonshape,这些类又各自的绘制方法。而对于文字编辑则较为复杂,涉及缓冲区的管理语法检查等,为此设计了单独的类textview类。现在想复用textview类实现textshape类,即需要转换textview的使用接口供shape的接口调用。对应的类模式适配器实现则是设计一个新类公有继承于shape类以提供访问接口,私有继承textview类隐藏其实现细节。而对象模式适配器的实现则是设计一个类派生于shape类内嵌一个textview对象指针作为类成员。通过这2种方式实现接口转换的作用。示例代码:
class point {
float x;
float y;
};
class shape {
public:
shape();
virtual void BoundingBox(point& bottomleft, point& topright) const=0;
};
class textView {
public:
textView(){};
void GetOrigin(){};
};
class textShape :public shape, private textView{
public:
textShape();
virtual void BoundingBox(point& bottomleft, point& topright){};
};
class textShape2 : public shape {
public:
virtual void BoundingBox(point& bottomleft, point& topright){};
private:
textView* _text;
};