1.目的
一个子系统(模块)会包含各种各样,可以实现各种不同功能的对象,他们之间可能并没有什么关系。当子系统外部,需要依赖这个子系统来完成各种不同的功能的时候,就需要与这些对象分别打交道,建立依赖关系。外观模式,就是为这个子系统建立一个类,统一处理外部的所有调用,该类持有子系统类的所有的对象,由其实现对外的接口,调度各个对象完成外部的各种请求,就像一个调度层一样。
如同下面的例子,Facade类提供两个对外的接口Method1()和Method2(),用户只看到Facade,并且调用Facade的两个接口,Facade知道这两个接口分别由O1、O3和O2、O4完成,这样就把子系统和外部系统隔离开来。
用途:
隔离不同的子系统,Facade相当于为每个子系统提供了一个统一的对外接口;当一个子系统经过一个阶段比较凌乱,新增功能需要依赖这个系统时,为这个系统提一个对外接口,隔离原有系统与新增功能,方便后续重构原有系统,就不会对新功能有影响。
2.代码
#ifndef FACADE_H_
#define FACADE_H_
#include <iostream>
using namespace std;
class Object1
{
public:
void fun1()
{
cout<<"fun1 called!"<<endl;
}
};
class Object2
{
public:
void fun2()
{
cout<<"fun2 called!"<<endl;
}
};
class Object3
{
public:
void fun3()
{
cout<<"fun3 called!"<<endl;
}
};
class Object4
{
public:
void fun4()
{
cout<<"fun4 called!"<<endl;
}
};
class Facade
{
public:
Facade():o1(*(new Object1)),o2(*(new Object2)), o3(*(new Object3)), o4(*(new Object4))
{}
void Method1()
{
cout<<"Method1 called!"<<endl;
o1.fun1();
o3.fun3();
}
void Method2()
{
cout<<"Method2 called!"<<endl;
o2.fun2();
o4.fun4();
}
private:
Object1& o1;
Object2& o2;
Object3& o3;
Object4& o4;
};
#endif /* FACADE_H_ */
facade.cpp
#include "Facade.h"
void facade()
{
Facade f;
f.Method1();
f.Method2();
};
运行结果:
Method1 called!
fun1 called!
fun3 called!
Method2 called!
fun2 called!
fun4 called!