设计模式学习笔记(七)——Adapter适配器

    技术2022-05-11  76

    六、Adapter(适配器)

    情景举例:

    解决类之间由于接口不匹配而不能复用的情况。

    代码示例:

    /* 目标类 */ class Shape { public:     Shape();     virtual void BoundingBox(         Point& bottomLeft, Point& topRight     ) const;     virtual Manipulator* CreateManipulator() const; }; /* 待匹配类 */ class TextView { public:     TextView();     void GetOrigin(Coord& x, Coord& y) const;     void GetExtent(Coord& width, Coord& height) const;     virtual bool IsEmpty() const; }; /* 类适配器:公有继承目标类,私有继承待匹配类 */ class TextShape : public Shape, private TextView { public:     TextShape();       virtual void BoundingBox(         Point& bottomLeft, Point& topRight     ) const;     virtual bool IsEmpty() const;     virtual Manipulator* CreateManipulator() const; }; /* */ void TextShape::BoundingBox (     Point& bottomLeft, Point& topRight ) const {     Coord bottom, left, width, height;       GetOrigin(bottom, left);     GetExtent(width, height); /* */     bottomLeft = Point(bottom, left);     topRight = Point(bottom + height, left + width); } /* 常见的直接转发请求的用法 */ bool TextShape::IsEmpty () const {     return TextView::IsEmpty(); } /* 对象适配器:公有继承目标类,以一个待匹配类的实例作为私有成员变量 */ class TextShape : public Shape { public:     TextShape(TextView*);       virtual void BoundingBox(         Point& bottomLeft, Point& topRight     ) const;     virtual bool IsEmpty() const;     virtual Manipulator* CreateManipulator() const; private:     TextView* _text; }; /* */ TextShape::TextShape (TextView* t) {     _text = t; } /* */ void TextShape::BoundingBox (     Point& bottomLeft, Point& topRight ) const {     Coord bottom, left, width, height;       _text->GetOrigin(bottom, left);     _text->GetExtent(width, height);       bottomLeft = Point(bottom, left);     topRight = Point(bottom + height, left + width); } /* */ bool TextShape::IsEmpty () const {     return _text->IsEmpty(); }

    个人理解:

    适配器模式只是简单改变类的接口的模式,主要分析下类适配器与对象适配器的区别。

    类适配器由于私有继承了待匹配类,则可以重定义其部分操作。而对象适配器不能。对象适配器可以应用在需要匹配某一父类和其全部子类的情况下,而类适配器则不能胜任。

     

    最新回复(0)