外观模式(Facade Pattern)也叫作门面模式,通过一个门面(Facade)向客户端提供一个访问系统的统一接口,客户端无须关心和知晓系统内部各子模块(系统)之间的复杂关系,其主要目的是降低访问拥有多个子系统的复杂系统的难度,简化客户端与其之间的接口。外观模式将子系统中的功能抽象成一个统一的接口,客户端通过这个接口访问系统,使得系统使用起来更加容易。
简单来说,外观模式就是将多个子系统及其之间的复杂关系和调用流程封装到一个统一的接口或类中以对外提供服务。这种模式涉及3种角色。
- 子系统角色:实现了子系统的功能。
- 门面角色:外观模式的核心,熟悉各子系统的功能和调用关系并根据客户端的需求封装统一的方法来对外提供服务。
- 客户角色:通过调用Facade来完成业务功能。
以汽车的启动为例,只需按下启动按钮,后台就会自动完成引擎启动、仪表盘启动、车辆自检等过程。通过外观模式将汽车启动这一系列流程封装到启动按钮上,对于用户来说只需按下启动按钮即可,不用太关心具体的细节。UML设计图如下:
1)定义Engine类:
@Slf4j
public class Engine {
public void startup() {
log.info("engine startup...");
}
public void shutdown() {
log.info("engine shutdown...");
}
}
2)定义Dashboard类:
@Slf4j
public class Dashboard {
public void startup() {
log.info("dashboard startup...");
}
public void shutdown() {
log.info("dashboard shutdown...");
}
}
3)定义SelfCheck类:
@Slf4j
public class SelfCheck {
public void startup() {
log.info("SelfCheck startup...");
}
public void shutdown() {
log.info("SelfCheck shutdown...");
}
}
4)定义门面类Starter封装Engine、Dashboard、SelfCheck:
package cn.jaa.facade_pattern;
import lombok.extern.slf4j.Slf4j;
/**
* @Author: Jaa
* @Description: 启动按钮
* @Date 2023/11/30
*/
@Slf4j
public class Starter {
private Engine engine;
private Dashboard dashboard;
private SelfCheck selfCheck;
public Starter() {
this.engine = new Engine();
this.dashboard = new Dashboard();
this.selfCheck = new SelfCheck();
}
public void startup() {
log.info("====car begin startup====");
engine.startup();
dashboard.startup();
selfCheck.startup();
log.info("====car startup finished====");
}
public void shutdown() {
log.info("====car begin shutdown====");
engine.shutdown();
dashboard.shutdown();
selfCheck.shutdown();
log.info("====car shutdown finished====");
}
}
5)测试外观模式:
package cn.jaa.facade_pattern;
import lombok.extern.slf4j.Slf4j;
/**
* @Author: Jaa
* @Description: 外观模式测试类
* @Date 2023/11/30
*/
@Slf4j
public class FacadeDemoTest {
public static void main(String[] args) {
Starter starter = new Starter();
// 启动汽车
starter.startup();
// 熄灭汽车
starter.shutdown();
}
}
运行结果: