设计模式之适配器(Adapter)---类对象结构型模式
1.意图
将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
2.别名
包装器Wrapper。
3.适用性
1)你想使用一个已经存在的类,而它的接口不符合你的需求。
2) 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
3)(仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。
4.结构
1)类适配器使用多重继承对一个接口与另一个接口进行匹配,如下图A1
2)对象匹配器依赖于对象组合,如下图A2示:
5.参与者
*Target
---定义Client 使用的与特定领域相关的接口。
*Client
---与符合Target接口的对象协同。
*Adaptee
---定义一个已存在的接口,这个接口需要适配。
*Adapter
---对Adaptee的接口与Target接口进行匹配。
6.协作
Client在Adapter实例上调用一些操作。接着适配调用Adaptee的操作实现这个请求。
7.代码示例:
/**************************************************************************
*
*
* 对应关系:TextView---Adaptee
* TextShape---Adapter
*
class Manipulator;
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;
};
#ifdef ClassAdapter
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 Manipulator {
};
class TextManipulator : public Manipulator {
public:
TextManipulator(const TextShape*);
};
Manipulator* TextShape::CreateManipulator () const {
return new TextManipulator(this);
}
#endif
#ifndef ClassAdapter
class TextView;
class Manipulator {
};
class TextManipulator : public Manipulator {
public:
TextManipulator();
};
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();
}
Manipulator* TextShape::CreateManipulator () const {
return new TextManipulator(this);
}
#endif
1.意图
将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
2.别名
包装器Wrapper。
3.适用性
1)你想使用一个已经存在的类,而它的接口不符合你的需求。
2) 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
3)(仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。
4.结构
1)类适配器使用多重继承对一个接口与另一个接口进行匹配,如下图A1
2)对象匹配器依赖于对象组合,如下图A2示:
5.参与者
*Target
---定义Client 使用的与特定领域相关的接口。
*Client
---与符合Target接口的对象协同。
*Adaptee
---定义一个已存在的接口,这个接口需要适配。
*Adapter
---对Adaptee的接口与Target接口进行匹配。
6.协作
Client在Adapter实例上调用一些操作。接着适配调用Adaptee的操作实现这个请求。
7.代码示例:
/**************************************************************************
*
*
* 对应关系:TextView---Adaptee
* TextShape---Adapter
*
class Manipulator;
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;
};
#ifdef ClassAdapter
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 Manipulator {
};
class TextManipulator : public Manipulator {
public:
TextManipulator(const TextShape*);
};
Manipulator* TextShape::CreateManipulator () const {
return new TextManipulator(this);
}
#endif
#ifndef ClassAdapter
class TextView;
class Manipulator {
};
class TextManipulator : public Manipulator {
public:
TextManipulator();
};
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();
}
Manipulator* TextShape::CreateManipulator () const {
return new TextManipulator(this);
}
#endif