1.定义
外观模式也称为门面模式,英文名称是Facade,为子系统的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这个子系统更加容易使用。
外观模式的结构示意图如下:
2.适用场景
1)假如您是中间件厂商,负责提供产品。那么客户使用产品的时候可以开发一个Facade类,由Facade类来对您的产品(可视为子系统)的基础功能进行特定的封装,这样客户端代码只需要跟Facade打交道就可以了,实现了解耦和简化子系统使用的双重功效。
2)今天看到介绍本山大叔给村民修路的新闻,就拿这个举例子吧。村民想让本山大叔给修路,本山大叔直接对身边的秘书说这事交给你办了,秘书具体负责联系厂家,监督质量等等各种具体麻烦事,负责跟各种人打交道,这里秘书就可看成是Facade,具体厂家等可以看做是SubSystem。有了Facade多省心,直接给money就可以了。
3.类图
1)SubSystemA,SubSystemB,SubSystemC:子系统,子系统不知道Facade,具体任务由子系统负责执行。
2)Facade:外观对象,负责调用具体的子系统来处理任务。
3)FacadeMain:客户端。
5.代码示例
public class SubSystemA {
public void method(){
System.out.println("访问子系统A的方法");
}
}
public class SubSystemB {
public void method(){
System.out.println("访问子系统B的方法");
}
}
public class SubSystemC {
public void method(){
System.out.println("访问子系统C的方法");
}
}
public class Facade {
public void method(){
SubSystemA subA = new SubSystemA();
subA.method();
SubSystemB subB = new SubSystemB();
subB.method();
SubSystemC subC = new SubSystemC();
subC.method();
}
}
public class FacadeMain {
public static void main(String[] args){
//直接访问子系统
SubSystemA subA = new SubSystemA();
subA.method();
SubSystemB subB = new SubSystemB();
subB.method();
SubSystemC subC = new SubSystemC();
subC.method();
System.out.println("----------------------");
//使用外观模式
Facade facade = new Facade();
facade.method();
}
}
输出结果:
访问子系统A的方法
访问子系统B的方法
访问子系统C的方法
----------------------
访问子系统A的方法
访问子系统B的方法
访问子系统C的方法
6.优点
1)它对客户屏蔽了子系统细节,减少了客户需要处理的对象的数目,使得子系统使用起来更加方便。
2)实现了子系统与客户之间的解耦,这样子系统变化只会影响到Facade,而不会影响到客户端。
3)Facade也可以使用在子系统内部的层与层之间。
4)Facade并不会限制客户端使用子系统,客户端也可以绕过Facade,直接访问子系统。
GoF《设计模式》