#include "stdafx.h"
#include <iostream>
using namespace std;
class SubSystemOne
{
public:
void MethodOne(){cout<<"子系统方法一\n";}
};
class SubSystemTwo
{
public:
void MethodTwo(){cout<<"子系统方法二\n";}
};
class SubSystemThree
{
public:
void MethodThree(){cout<<"子系统方法三\n";}
};
class Facade
{
public:
Facade()
{
m_pOne = new SubSystemOne;
m_pTwo = new SubSystemTwo;
m_pthree = new SubSystemThree;
}
void MethodA()
{
cout<<"组方法A\n";
m_pOne->MethodOne();
m_pthree->MethodThree();
}
void MethodB()
{
cout<<"组方法B\n";
m_pOne->MethodOne();
m_pTwo->MethodTwo();
m_pthree->MethodThree();
}
//组方法C、D、E……
~Facade()
{
delete m_pOne; m_pOne = NULL;
delete m_pTwo; m_pTwo = NULL;
delete m_pthree; m_pthree = NULL;
}
private:
SubSystemOne *m_pOne;
SubSystemTwo *m_pTwo;
SubSystemThree *m_pthree;
};
int _tmain(int argc, _TCHAR* argv[])
{
Facade *pfacade = new Facade;
pfacade->MethodA();
pfacade->MethodB();
delete pfacade;
pfacade = NULL;
return 0;
}
适用场合:
首先,在设计初期阶段,应该要有意识地将两个不同的层分离,如三层构架(数据访问层、业务逻辑层、表示层),层与层之间建立外观,这样可以为复杂的子系统提供简单的接口;
其次:开发阶段,子系统往往因不断地重构演化而变得越来越复杂,增加外观可以提供一个简单的接口,减少他们之间的依赖;
第三,在维护一个大系统时,可以为新的系统开发一个外观Facade类,让新系统与Facade交互,Facade与遗留代码交互所有复杂的工作;
外观模式是非常常用的模式之一,它完美体现了依赖倒转原则和迪米特法则的思想
依赖倒转原则:A,高层模块不应该依赖底层模块,两个都应该依赖抽象
B,抽象不应该依赖细节,细节应该依赖抽象;即针对接口编程,不要针对实现编程;
迪米特法则:如果两个类彼此不直接通信,那么这两个类就不应当发生直接的相互作用,如果一个类需要另一个类的某一个方法,可以通过第三者转发调用;
其根本思想是强调类之间的松耦合,类之间的耦合越弱,越有利于服用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。