C++设计模式(11)——适配器模式

动机(Motivation)

  • 由于应用环境的变化,常常需要将”一些现存的对象“放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足。

  • 如何应对这些”迁移的变化“?

模式定义

将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 ——《设计模式》GoF

要点总结

  • 在遗留代码复用、类库迁移等方面有用

 非适配器模式

缺点:

增加个欧元(ERO)的时候,对外的接口发生了变化,代码的功能需要重新写,功能也需要重新测试,违背了开闭原则。

#include <iostream>
#include <string>
#include <vector>

using namespace std;

class RMB
{
public:
	void show()
	{
		cout << "show RMB" << endl;
	}
};

class USD
{
public:
	void showUSD()
	{
		cout << "show USD" << endl;
	}
};

int main()
{
	RMB *rmb = new RMB();
	rmb->show();

	USD *usd = new USD();
	usd->showUSD();

    delete rmb;
    rmb = nullptr;
    delete usd ;
    usd = nullptr;
}

适配器模式

#include <iostream>

using namespace std;

//Target,目标
class RMB
{
public:
	void show()
	{
		cout << "show RMB" << endl;
	}
};

//Adaptee接口
class IAdaptee
{
public:
	virtual void showMoney() = 0;
};

//Adaptee,需要转换的接口
class USD : public IAdaptee
{
public:
	void showMoney()
	{
		cout << "show USD" << endl;
	}
};

//扩展
class ERO : public IAdaptee
{
public:
	void showMoney()
	{
		cout << "shwo ERO" << endl;
	}
};


//Adaptor,转换适配器
//继承自目标接口,包含Adaptee,通过和目标接口相同的函数来调用Adaptee中实际功能,起到迁移的作用
class Adaptor : RMB
{
private:
	IAdaptee *m_adaptee;

public:
	Adaptor(IAdaptee *adaptee):m_adaptee(adaptee){}
	void show()
	{
		m_adaptee->showMoney();
	}
};
int main()
{
	RMB *rmb = new RMB();
	rmb->show();

	USD *usd = new USD();
	Adaptor *ad = new Adaptor(usd);
	ad->show();

	ERO *ero = new ERO();
	Adaptor *ad1 = new Adaptor(ero);
	ad1->show();

    //delete..
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值