上篇我们讲了单例模式,这篇我们来聊聊外观模式,这也是一种咱们平时开发中使用率非常高的设计模式之一。在以下的例子中我会将传统的代码调用方式和外观模式对比,让大家一目了然外观模式的优势。
外观模式:
以下代码在VS2012上编译通过
.h文件
class systemA
{
public:
void showA();
};
class systemB
{
public:
void showB();
};
class systemC
{
public:
void showC();
};
class Facade
{
private:
static systemA* pa;
static systemB* pb;
static systemC* pc;
public:
void show();
};
.cpp文件
systemA* Facade::pa=new systemA();
systemB* Facade::pb=new systemB();
systemC* Facade::pc=new systemC();
void Facade::show()
{
pa->showA();
pb->showB();
pc->showC();
}
void systemA::showA()
{
cout<<"call systemA"<<endl;
}
void systemB::showB()
{
cout<<"call systemB"<<endl;
}
void systemC::showC()
{
cout<<"call systemC"<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
/**********传统调用方式*************/
systemA* pa=new systemA();
pa->showA();
systemB* pb=new systemB();
pb->showB();
systemC* pc=new systemC();
pc->showC();
cout<<"-------------"<<endl;
/**********外观模式调用方式*************/
Facade* pf=new Facade();
pf->show();
return 0;
}
执行结果:
call systemA
call systemB
call systemC
-------------
call systemA
call systemB
call systemC
由以上看出外观模式本质上是在外部调用和内部子系统直接增添了一个中间层Facade类,由该类来代为调用内部子系统方法,而外部调用不需要了解内部系统的细节。传统调用方式和外观模式调用方式就好比自助餐饭店和普通饭店点餐的区别,自助餐饭店要自己知道饭菜放在房间哪个位置,要吃什么菜都得自己去一个个拿。而普通饭店不需要知道饭菜放在哪里,要吃什么只需要通知服务员就可以了,然后服务员去拿。这个服务员角色就类似于外观模式中的Facade类。