简介
隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。属于结构型模式。这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。
适用场景
1、当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。外观模式facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过提供的外观层。
2、客户程序与抽象类的实现部分之间存在着很大的依赖性。引入外观模式facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
3、当你需要构建一个层次结构的子系统时,使用外观模式facade定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们仅通过外观模式facade进行通讯,从而简化了它们之间的依赖关系。
代码实现
#include <iostream>
using namespace std;
class SystemA
{
public:
void doThing()
{
cout << "systemA do...." << endl;
}
};
class SystemB
{
public:
void doThing()
{
cout << "systemA do...." << endl;
}
};
class SystemC
{
public:
void doThing()
{
cout << "systemA do...." << endl;
}
};
class Facade
{
public:
Facade()
{
a = new SystemA;
b = new SystemB;
c = new SystemC;
}
~Facade()
{
delete a;
delete b;
delete c;
}
void doThing()
{
a->doThing();
b->doThing();
c->doThing();
}
protected:
private:
SystemA *a;
SystemB *b;
SystemC *c;
};
void main()
{
/*
SystemA *a = new SystemA;
SystemB *b = new SystemB;
SystemC *c = new SystemC;
a->doThing();
b->doThing();
c->doThing();
delete a;
delete b;
delete c;
*/
Facade *f = new Facade;
f->doThing();
delete f;
cout<<"hello..."<<endl;
system("pause");
return ;
}
优缺点
优点:
- 提供了一个简单的接口,对客户端隐藏了子系统的复杂性。
- 降低了客户端与子系统之间的耦合度,隔离了客户端与子系统之间的变化。
- 可以提高代码的可维护性和可读性。
缺点:
- 外观模式可能会导致系统变得更加复杂。虽然外观模式可以隐藏一些复杂性,但它也增加了另一个层次的间接性,导致了更多的代码和更难调试的问题。
- 如果需要修改某个子系统的功能,可能需要修改外观的代码。这可能会导致外观不再简单,并且可能需要重新设计。