Structural.Adapter适配器模式:新接口,老方法

思考适配器模式

  ①适配器模式的本质转换匹配,复用功能。它通过转换调用己有的实现,从而能把己有的实现匹配成需要的接口,使之能满足客户端的需要。

  ②适配器模式的动机:将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存的对象所不满足的。为了应对这种“迁移的变化”,既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口而提出的。

  ③适配器模式的意图:将一个接口转换成客户希望的另一个接口。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;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值