思考适配器模式
①适配器模式的本质:转换匹配,复用功能。它通过转换调用己有的实现,从而能把己有的实现匹配成需要的接口,使之能满足客户端的需要。
②适配器模式的动机:将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存的对象所不满足的。为了应对这种“迁移的变化”,既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口而提出的。
③适配器模式的意图:将一个接口转换成客户希望的另一个接口。Adapter使原本由于接口不兼容而不能在一起工作的那些类可以在一起工作。
④Adaptee和Target的关系:被适配的接口Adaptee和适配的目标接口Target是没有关联的,他们可以是完全不同的两个接口。
绘图工具(整合己有的工具)
//声明文件
//************************************绘图接口********************************
class CAbsShp{
public:
virtual void Draw() = 0;
};
//新的类直接继承自Shape
//矩形
class CRectangle : public CAbsShp{
public:
void Draw();
};
//三角形
class CTriangle : public CAbsShp{
public:
void Draw();
};
//画线
class CLine : public CAbsShp{
public:
void Draw();
};
//***************************************己有的旧的类,但接口与shape不同
class CAbsCircle{
public:
virtual void DrawCircle() = 0;
};
//原来己写好的旧类(来自ICircle)接口
class CCircleAdaptee : public CAbsCircle{
public:
void DrawCircle();
};
//适配器,用来将ICircle转换为Shape接口
class CCircleAdapter : public CAbsShp{
private:
//己经存在的接口,通常能满足客户端的功能要求,
//但接口与客户端要求的特定领域接口不一致,需要被适配
CAbsCircle* pAdaptee;
public:
CCircleAdapter(CAbsCircle* adaptee);
~CCircleAdapter();
//委托drawCircle接口去实现
void Draw();
};
//实现文件
//新的类直接继承自Shape
//矩形
void CRectangle::Draw(){cout << "CRectangle Shape.Draw()..." << endl;}
//三角形
void CTriangle::Draw(){cout << "Triangle Shape.Draw()..." << endl;}
//画线
void CLine::Draw(){cout << "Line Shape.Draw()..." << endl;}
//***************************************己有的旧的类,但接口与shape不同
//原来己写好的旧类(来自ICircle)接口
void CCircleAdaptee::DrawCircle(){cout << "Circle.DrawCircle()..." << endl;}
//适配器,用来将ICircle转换为Shape接口
//己经存在的接口,通常能满足客户端的功能要求,
//但接口与客户端要求的特定领域接口不一致,需要被适配
CCircleAdapter::CCircleAdapter(CAbsCircle* adaptee = NULL){pAdaptee = adaptee;}
CCircleAdapter::~CCircleAdapter(){if(pAdaptee != NULL) delete pAdaptee;}
//委托drawCircle接口去实现
void CCircleAdapter::Draw(){pAdaptee->DrawCircle();}
//测试客户端
void main()
{
//画线、矩形、三角形
CAbsShp* pTriangle = new CTriangle();
if(pTriangle != NULL){
pTriangle->Draw();
delete pTriangle; pTriangle = NULL;
}
//通过适配器来画圆
CAbsShp* pCircleAdapter = new CCircleAdapter(new CCircleAdaptee());
if(pCircleAdapter != NULL){
pCircleAdapter->Draw();
delete pCircleAdapter; pCircleAdapter = NULL;
}
}