Design Pattern Adaptor 适配器设计模式

适配器设计模式是为了要使用一个旧的接口,也许这个接口很难用,也许是和新的更新的接口不兼容,所以需要设计一个适配器类,然后就可以让新旧的接口都统一。

就是这样的一个图:


比如我们有这样的一个旧的类:

class OldName
{
public:
	virtual void setName(string n) = 0;
	virtual string getName() = 0;
};

class OldNameMetheds : public OldName
{
	string name;
public:
	OldNameMetheds(string n = "") : name(n)
	{
	}

	void setName(string n)
	{
		name = n;
	}

	string getName()
	{
		return name;
	}
};

这样我们只能设计一个字符串的名字,但是现在我们有一个新的类:

//base class
class NewName
{
public:
	virtual void setFirstName(string first) = 0;
	virtual void setLastName(string last) = 0;
	virtual string getFirstName() = 0;
	virtual string getLastName() = 0;
};

class NewNameMethod : public NewName
{
protected:
	string first_name;
	string last_name;
public:
	NewNameMethod(string first = "", string last = "") : first_name(first), 
		last_name(last)
	{
	}

	void setFirstName(string first)
	{
		first_name = first;
	}

	void setLastName(string last)
	{
		last_name = last;
	}

	string getFirstName()
	{
		return first_name;
	}

	string getLastName()
	{
		return last_name;
	}
};

旧类和新类就不兼容了,故此需要一个Adaptor接口类:

//The real adaptor class
class Old2NewNameAdaptor : public NewNameMethod
{
	OldName *old;
public:
	Old2NewNameAdaptor(OldName *o) : old(o)
	{
		string name = old->getName();
		unsigned i = 0;
		for (; i < name.size() && name[i] != ' '; i++)
		{
			first_name.push_back(name[i]);
		}
		for (i++; i < name.size(); i++) last_name.push_back(name[i]);
	}
};

可以看到,该类继承了新类,并且自动处理了oldname,把oldname的内容转存进newname中了,中间就是多了一个自动转换的功能,并没有太多神奇的东西,但是对于用户来说就方便很多啦。

然后可以这样使用:

void Adaptor_Run()
{
	OldName *oldname = &OldNameMetheds();
	oldname->setName("Bill Gate");

	//小心这样写会有错误:原来的名字就会变成空了,没保留NewName *old2new = &Old2NewNameAdaptor(oldname);原因:应该是因为这个是临时变量,指针指向一个空的临时变量,那么是没有数据的!
	Old2NewNameAdaptor o2n(oldname);

	NewName *old2new = &o2n;//这样写,结果正确!

	cout<<"The first name is: "<<old2new->getFirstName()<<endl
		<<"The last name is : "<<old2new->getLastName()<<endl;
}

这里的old2new是一个新类,可以使用这个新类操作旧类的数据了。

最后运行:





  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值