目的
简化客户端对子系统的调用,在一定程度上解耦客户端与子系统。
定义
外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。
结构

-
Facade:外观角色
-
SubSystem:子系统角色
demo
子系统
public class RiceCooker {
//具备煮饭的子系统
public void pushRice() {
System.out.println("放入米");
}
public void heating() {
System.out.println("煮饭中。。。");
}
}
public class Pot {
//具备炒菜的子系统
public void fire() {
System.out.println("点火");
}
public void cooking() {
System.out.println("炒菜");
}
}
client
不使用外观模式
public class Client {
public static void main(String[] args) {
Pot pot = new Pot();
RiceCooker riceCooker = new RiceCooker();
riceCooker.pushRice();
riceCooker.heating();
pot.fire();
pot.cooking();
System.out.println("做好饭了可以吃了");
}
}
使用外观模式
public class Client {
public static void main(String[] args) {
Pot pot = new Pot();
RiceCooker riceCooker = new RiceCooker();
MakeLunch makeLunch = new MakeLunch(riceCooker,pot);
makeLunch.make();
System.out.println("做好饭了可以吃了");
}
}
public class MakeLunch {
private RiceCooker riceCooker;
private Pot pot;
public MakeLunch(RiceCooker riceCooker, Pot pot) {
this.riceCooker = riceCooker;
this.pot = pot;
}
public void make() {
riceCooker.pushRice();
riceCooker.heating();
pot.fire();
pot.cooking();
}
}
使用外观模式较没使用而言,客户端不需要知道子系统内部的方法,只需要调用外观角色提供的统一接口就可以完成一些列操作。
优点
- 只是提供一个入口,客户端任可以直接使用子系统
- 降低客户端的复杂度
缺点
- 不能限制客户端直接使用子系统
- 增加新的子系统时需要修改外观类代码违反开闭原则
使用时机
- 当要为一个复杂子系统提供一个简单接口并且用户也可以直接访问子系统时可以使用外观模式。
- 在层次结构中需要降低层之间的耦合度时。