外观模式(Facade)
为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层的接口,这个接口使得这一子系统更加容易使用。
背景:大家都不懂股票,去买造成了亏损。但基金可以把钱交给基金经理,由他打理,个人无需知道股票是如何运行的。即加个中间人。专业人做专业事。降低了耦合性。
如下:耦合性太高
UML结构图
C++代码
class SystemA {
public:
void fun1()
{
cout << "系统A的方法1" << endl;
}
};
class SystemB {
public:
void fun2()
{
cout << "系统B的方法2" << endl;
}
};
class SystemC {
public:
void fun3()
{
cout << "系统C的方法3" << endl;
}
};
class Facade { //外观类,它需要了解所有子系统的方法或属性,并进行不同组合,以备外界调用
public:
Facade() {
a = new SystemA;
b = new SystemB;
c = new SystemC;
}
void zuhe1()
{
a->fun1();
c->fun3();
}
void zuhe2()
{
c->fun3();
b->fun2();
}
private:
SystemA* a;
SystemB* b;
SystemC* c;
};
int main()
{
//由于facade的作用客户端可以根本不用知道三个系统子类的存在
Facade* fa = new Facade();
fa->zuhe1();
fa->zuhe2();
}
何时使用
1.外观模式完美的体现了依赖倒转原则和迪米特法则。
2.何时使用:首先,设计初期阶段,要有意识将不同的两个层分离。(经典的三层结构,层与层之间建立facade,为复杂的子系统提供简单的接口,降低耦合性)。
其次,开发阶段,子系统往往因为不断地重构演化变得越来越复杂,大多数模式使用地时候也会产生很多小类,本是好事,但给外部调用他们的程序带来了很大的困难,可以提供一个Facade,减少依赖。
最后,维护一个遗留的大型系统,可能系统已经非常难以维护和扩展了,但包含了非常重要的功能,可以为新系统开发一个Facade外观类,来提供设计粗糙或高度复杂的遗留代码比较清晰简单的接口,让新系统与Facade对象交互,facade与旧系统交互。