定义:
要求一个子系统的外部和其内部的通信必须通过一个统一的对象进行,门面模式提供一个高层次的接口,使得子系统更易于使用。
“统一的对象”,也就是提供一个访问子系统的接口,除了这个接口,不允许有任何访问子系统的行为发生,门面对象是外界访问子系统的唯一通道,不管子系统内部是多么杂乱无章,只要有门面模式在,就可以做到“金玉其外,败絮其中”。
其通用类图如下:
举一个简单的模拟的例子:
public class ClassA {
public void doSomethingA(){
System.out.println("A.....");
}
}
public class ClassB {
public void doSomethingB(){
System.out.println("B.....");
}
}
public class ClassC {
public void doSomethingC(){
System.out.println("C.....");
}
}
/*
* 门面模式,外部要访问子系统内部的方法,要通过门面对象
*/
public class Facade {
private ClassA A=new ClassA();
private ClassB B=new ClassB();
private ClassC C=new ClassC();
public void methodA(){
this.A.doSomethingA();
}
public void methodB(){
this.B.doSomethingB();
}
public void methodC(){
this.C.doSomethingC();
}
}
其实一个子系统可以有多个门面,并且当有受限的外部对象要访问子系统时,尤其要根据不同对象的权限设计不同的门面对象,如下面的第二个门面对象:
/*
* 新增的门面对象,这里只提供了对methodB()方法的访问权限,
* 而且是委托给了已经存在的门面对象facade进行处理,这样做
* 是为了不重复写相同的代码,避免以后到处修改相同代码的悲剧
*/
public class Facade2 {
private Facade facade=new Facade();
public void methodB(){
this.facade.methodB();
}
}
另外需要注意的一点是,门面模式是不应该参与子系统内的业务逻辑,它只是提供了一个访问子系统的路径而已,所以所有的业务逻辑应该在子系统内部进行解决,提供给门面对象的总是对外的接口。
门面模式的优点:
1、减少了系统的相互依赖,避免了外界直接访问子系统内部,造成强耦合的关系。
2、提高了安全性
门面模式的缺点:
最大的缺点就是不符合开闭原则,当子系统有了小问题需要修改涉及到了门面对象,那么门面对象只有直接修改代码。
门面模式的使用场景还有必要说一下:
1、为一个复杂的模块或子系统提供一个供外界访问的接口
2、子系统相对独立,外界对子系统的访问只需要黑箱操作即可
3、预防低水平人员带来的风险扩散