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;
}