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是一个新类,能够使用这个新类操作旧类的数据了。

最后执行:





posted @ 2017-06-21 17:24  llguanli  阅读(197)  评论(0编辑  收藏  举报