外观模式(Facade)
-
介绍:为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
外部应用程序不用关心内部子系统的具体细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。 -
外观(Facade)模式是“迪米特法则”的典型应用
-
优点:
降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。
对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。
降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程,因为编译一个子系统不会影响其他的子系统,也不会影响外观对象。 -
缺点:
不能很好地限制客户使用子系统类,很容易带来未知风险。
增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则” -
主要角色。
外观(Facade)角色:为多个子系统对外提供一个共同的接口。
子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它。
例子: 一键开机,我们不必关心电脑内部怎么运行。
#include "iostream"
#include "string"
using namespace std;
//子系统
class Memory
{
public:
Memory(){}
void SelfCheck()
{
cout << "--内存自检--" << endl;
}
};
//子系统
class CPU
{
public:
CPU(){}
void Run()
{
cout << "--运行CPU--" << endl;
}
};
//子系统
class HardDisk
{
public:
HardDisk(){}
void Read()
{
cout << "--读取硬盘--" << endl;
}
};
//外观类
class Facade
{
public:
Facade()
{
m_pMem = new Memory();
m_pCpu = new CPU();
m_pHad = new HardDisk();
}
~Facade()
{
delete m_pMem;
delete m_pCpu;
delete m_pHad;
}
void PowerOn()
{
cout << "正在开机" << endl;
m_pMem->SelfCheck();
m_pCpu->Run();
m_pHad->Read();
cout << "开机完成" << endl;
}
private:
Memory * m_pMem;
CPU * m_pCpu;
HardDisk * m_pHad;
};
int main()
{
Facade *pFac = new Facade();
pFac->PowerOn();
delete pFac;
system("pause");
return 1;
}
运行结果:
正在开机
--内存自检--
--运行CPU--
--读取硬盘--
开机完成