英文:
Facade
使用频率:
高
作用:
使用一个外观类封装一个子系统,让子系统的使用更加方便。
场景举例:
比如我们装修,那么这个装修子系统,需要自己买木板,水管,电线等东西,那么这几样事情都需要我们自己一件件去做。
那这时候,我们也可以找装修公司。我们只需要告诉装修公司我预算多少,你帮我装修,至于买什么东西,我都不必操作。根本不用知道哪种木板好,水管好之类的。这时候装修公司就帮我们把装修子系统封装起来了。提供一个简单易用的装修接口,实现了我们和装修子系统的耦合。
或者买基金股票也是的。我们自己买股票不是太懂,而且风险很大。那我们可以买基金,让靠谱的基金经理组合多种股票,他们比我们获益可能性就高多了。我们也不用操心具体买什么股票了。
类图:
好处:
解耦客户和子系统。如果子系统变化,只用改变外观类就行了。
源码
下面代码实现了装修买材料的这些接口。可以看到这一处购买材料实际上将逻辑从客户端移动到了Facade外观接口中了。这样子,客户端使用起来就很方便了。另外,也方便复用外观里面的接口。
#include <iostream>
using namespace std;
namespace SubSystem{
class Wood
{
public:
void Buy()
{
cout << "Buy Wood" << endl;
}
};
class Wire
{
public:
void Buy()
{
cout << "Buy Wire" << endl;
}
};
class Pipe
{
public:
void Buy()
{
cout << "Buy Pipe" << endl;
}
};
}
class Facade
{
public:
void Decorate()
{
m_wood.Buy();
m_pipe.Buy();
m_wire.Buy();
}
private:
SubSystem::Wood m_wood;
SubSystem::Wire m_wire;
SubSystem::Pipe m_pipe;
};
int main()
{
SubSystem::Wire wire;
SubSystem::Pipe pipe;
SubSystem::Wood wood;
wood.Buy();
pipe.Buy();
wire.Buy();
cout << "using Facade pattern" << endl;
Facade facade;
facade.Decorate();
return 0;
}