意图
提供了一个统一的接口,用来访问子系统中的一群接口,从而让子系统更容易使用。
类图
classDiagram
class Client
class Facade {
-subSystem SubSystem
+watchMovie() void
}
class SubSystem {
+turnOnTV() void
+setCD(cd String) void
+starWatching() void
}
Client ..> Facade : 只依赖外观
Facade o-- SubSystem : 封装子系统
外观模式为子系统中的一组接口提供一个高层接口,客户端只需和外观对象交互,无需了解子系统内部的复杂调用关系。
实现
观看电影需要操作很多电器,使用外观模式实现一键看电影功能:
public class SubSystem {
public void turnOnTV() {
System.out.println("turnOnTV()");
}
public void setCD(String cd) {
System.out.println("setCD( " + cd + " )");
}
public void starWatching() {
System.out.println("starWatching()");
}
}
public class Facade {
private SubSystem subSystem = new SubSystem();
public void watchMovie() {
subSystem.turnOnTV();
subSystem.setCD("a movie");
subSystem.starWatching();
}
}
public class Client {
public static void main(String[] args) {
Facade facade = new Facade();
facade.watchMovie();
}
}
体现的设计原则
最少知识原则(迪米特法则):只和你的密友谈话。也就是说客户对象所需要交互的对象应当尽可能少。详见 SOLID 设计原则中的迪米特法则一节。
实际应用
- Spring 的
JdbcTemplate封装了Connection、Statement、ResultSet等一系列 JDBC 操作 - SLF4J 作为日志门面封装了底层日志实现(见日志类库详解)
- 各种”XXManager”、“XXService”的聚合入口多数是外观思想的应用
系列导航
- 上一篇:装饰(Decorator)
- 下一篇:享元(Flyweight)
- 相关阅读:外观是迪米特法则的经典应用;与中介者模式的区别是外观单向简化调用,中介者双向协调交互