外观模式
定义:
为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
适用性:
1、 当想要为一个复杂子系统提供一个简单接口时。
2、 客户程序与抽象类的实现部分之间存在着很大的依赖性。
3、 需要构建一个层次结构的子系统时,使用外观模式定义子系统中每层的入口点。
结构:

实现:< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+Ly/X08+1zbPE2rXEwOAgQ2xhc3NBICBDbGFzc0IgIENsYXNzQzwvcD4KPHAgYWxpZ249"left">class ClassA
{
public:
voiddoSomethingA()
{
cout<<"ClassA doSomethingA"<
}
};
class ClassB
{
public:
voiddoSomethingB()
{
cout<<"ClassB doSomethingB"<
}
};
class ClassC
{
public:
voiddoSomethingC()
{
cout<<"ClassC doSomethingC"<
}
};
//封装的外观类,提供了访问子系统类的三个方法
class Facade
{
public:
Facade()
{
m_pa = newClassA;
m_pb = newClassB;
m_pc = newClassC;
}
~Facade()
{
if(m_pa)
{
deletem_pa;
}
if(m_pb)
{
deletem_pb;
}
if(m_pc)
{
deletem_pc;
}
}
voidmethodA()
{
m_pa->doSomethingA();
}
voidmethodB()
{
m_pb->doSomethingB();
}
voidmethodC()
{
m_pc->doSomethingC();
}
private:
ClassA *m_pa;
ClassB *m_pb;
ClassC *m_pc;
};
Facade *pf = newFacade;
pf->methodA();
pf->methodB();
pf->methodC();

需要注意的:
1、 子系统可以有多个外观。不同的模块可能需要方法子系统的功能不一样,所以可能有多个外观
2、 封装的外观类不参与子系统内的业务逻辑。意思是不要出现以下这种情况:
void methodB()
{
m_pb->doSomethingB();
m_pc->doSomethingC();
}
如果确实需要这么做,最好将ClassB 和 ClassC 独立增加一个封装类