首页 > 代码库 > Design Pattern Facade 门面设计模式

Design Pattern Facade 门面设计模式

Facade设计模式主要作用是因为有个很难使用的类,然后要设计一个新类,整理好这个类,使得其更好使用。

比如有类如此:

class MessyClass
{
	char *name;
public:
	MessyClass() : name(new char[3])
	{
		for (int i = 0; i < 3; i++)
		{
			name[i] = ' ';
		}
	}

	~MessyClass()
	{
		delete [] name;
	}

	void setFirstName(char a)
	{
		name[0] = a;
	}

	void setSecName(char b)
	{
		name[1] = b;
	}

	void setThirdName(char c)
	{
		name[2] = c;
	}

	char *getName()
	{
		return name;
	}
};

这样需要一个字符一个字符给这个类命名,那么就很繁琐。

可以使用一个类把这样的命名简化为一个字符串:

//Facade class
class NewNoNMessyClass
{
	MessyClass messy;
public:
	NewNoNMessyClass() : messy()
	{
	}

	void setName(string n)
	{
		if (n.size() > 0) messy.setFirstName(n[0]);
		if (n.size() > 1) messy.setSecName(n[1]);
		if (n.size() > 2) messy.setThirdName(n[2]);
	}

	string getName()
	{
		return messy.getName();
	}
};

这样只需要一个字符串就能给这个类命名了。

也可以这样设计:

class NewNoNMessyClass_2
{
	MessyClass *messy;
public:
	NewNoNMessyClass_2(MessyClass *me) : messy(me)
	{
	}

	void setName(string n)
	{
		if (n.size() > 0) messy->setFirstName(n[0]);
		if (n.size() > 1) messy->setSecName(n[1]);
		if (n.size() > 2) messy->setThirdName(n[2]);
	}

	string getName()
	{
		return messy->getName();
	}
};

这样仍然可以使用原来的MessyClass来操作,不过通过这个新类的函数可以方便给这个类命名。

测试:

void Faced_Run()
{
	NewNoNMessyClass nonMessy;
	nonMessy.setName("LOVE");
	cout<<nonMessy.getName()<<endl;

	MessyClass mec;//Orignal messy class
	NewNoNMessyClass_2 non2(&mec);//use new class to tide up messy class
	non2.setName("He");
	cout<<mec.getName()<<endl
		<<non2.getName()<<endl;
}