定义
- 将类之间的复杂关系与调用封装进一个对外提供简单接口的类中。
使用场景
- 类之间的关系和调用十分复杂。
- 举例:影院观影打开各种设备:展开屏幕,打开投影仪,打开DVD 等等
UML图
代码实现
public class DVDPlayer {
public static void on(){
System.out.println("打开 DVD");
}
public static void off(){
System.out.println("关闭 DVD");
}
}
public class Screen {
public static void down(){
System.out.println("展开屏幕");
}
public static void up(){
System.out.println("收缩屏幕");
}
}
public class Projector {
public static void on(){
System.out.println("打开 投影仪");
}
public static void off(){
System.out.println("关闭 投影仪");
}
}
public class Facade {
public void movieStart(){
Screen.down();
Projector.on();
DVDPlayer.on();
}
public void movieEnd(){
DVDPlayer.off();
Projector.off();
Screen.up();
}
}
public class Client {
public static void main(String[] args) {
Facade facade = new Facade();
facade.movieStart();
}
}
总结
- 将类之间的复杂关系与调用封装进一个对外提供简单接口的类中。
- 外观模式是“迪米特法则”的体现,客户端对各个子系统一无所知。
- 外观类将客户端与子系统的内部复杂性分隔开,使得客户端只需要与外观对象打交道,而不需要与子系统内部的很多对象打交道。
- 外观模式最大的缺点在于违背了“开闭原则”。