外观模式(Facade):
为了系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
1.在设计初期阶段,应该有意识的将不同的两个层分离,比如经典的三层架构,就需要考虑在数据访问层和业务逻辑层、业务逻辑层和标示层的
层与层之间建立外观Facade,这样可以为复杂的子系统提供一个简单的接口,使得耦合度大大降低。
2.其次在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,大多数的模式使用时也都会产生很多小的类,这本身是好事,但也给外部调用他们的用户程序带来了使用上的困难,增加外观Facade可以提供一个简单的接口,减少它们之间的依赖。在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,但因为它包含非常重要的功能,新的需求开发必须要依赖于它。此时用外观模式Facade也是非常合适的,你可以为新的系统开发一个外观Facade类,来提供设计粗糙或高度复杂的遗留代码的比较简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。
3.最后要在说下一个东西,看到这个模式突然就想起了模板模式,说下区别,模板模式是接口方面暴漏出来一些必须实例化的函数,并且喜欢在接口里直接定义好一些对外函数,我们实现之后直接运行对外函数就行了,所有的东西都是模板化的,而今天的这个外观模式则是把一些已经开发完成或者是比较麻烦繁琐的东西整理成一套一套的接口,这样我们不用关心细节,直接调用整理好的接口就行了,也就是把一些乱的东西封装一下,然后我们直接调用封装好的类,显然优势就是调用者的耦合度非常低,只和被封装的外观类有关系。
然后是实现下上面的UML所表达的结构。
模式实现代码:
#pragma once
#include <string>
#include <iostream>
using namespace std;
class CSubSystemOne
{
public:
void SubSystemA()
{
cout<<"Subsystem method A"<<endl;
}
};
class CSubSystemTwo
{
public:
void SubSystemB()
{
cout<<"Subsystem method B"<<endl;
}
};
class CSubSystemThree
{
public:
void SubSystemC()
{
cout<<"Subsystem method C"<<endl;
}
};
class CFacade
{
public:
CSubSystemOne *m_cSystemOne;
CSubSystemTwo *m_cSystemTwo;
CSubSystemThree *m_cSystemThree;
CFacade()
{
m_cSystemOne = new CSubSystemOne();
m_cSystemTwo = new CSubSystemTwo();
m_cSystemThree = new CSubSystemThree();
}
void FacadeShowA()
{
m_cSystemOne->SubSystemA();
m_cSystemThree->SubSystemC();
}
void FacadeShowB()
{
m_cSystemTwo->SubSystemB();
m_cSystemThree->SubSystemC();
}
~CFacade()
{
delete m_cSystemOne;
delete m_cSystemTwo;
delete m_cSystemThree;
m_cSystemOne = NULL;
m_cSystemTwo = NULL;
m_cSystemThree = NULL;
}
};
客户端调用代码:
#include "stdafx.h"
#include "Facade.h"
#include <windows.h>
using namespace std;
int main()
{
CFacade *pFacade = new CFacade();
pFacade->FacadeShowA();
pFacade->FacadeShowB();
delete pFacade;
return 0;
}
运行结果: