面临问题:
只需要使用某个复杂系统的子集,或者,需要以一种特殊的方式与系统进行交互。
如何“简化外部客户程序和系统间的交互接口” ?如何将外部客户程序的演化和内部子系统的变化之间的依赖相互解耦?
解决方案:
Façade为原有系统的Client提供了一个新的接口。外部与一个子系统的通信必须通过一个统一的门面(Façade)对象进行,这就是门面模式。
典型的外观角色代码:
public class Facade
{
private SubSystemA obj1 = new SubSystemA();
private SubSystemB obj2 = new SubSystemB();
private SubSystemC obj3 = new SubSystemC();
public void method()
{
obj1.method();
obj2.method();
obj3.method();
}
}
从客户程序的角度来看,Façade模式不仅简化了整个组件系统的接口,同时对于组件内部与外部客户程序来说,从某种程度上也达到了一种“解耦”的效果----内部子系统的任何变化不会影响到Façade接口的变化 。
相关的模式:
Abstract Factory模式可以与Façade模式一起使用以提供一个接口,这一接口可用来以一种子系统独立的方式创建子系统对象。
Mediator模式与Façade模式的相似之处是,它抽象了一些已有的类的功能。
通常仅需要一个Façade对象,因此可以用Singleton模式