软件设计模式白话文系列(十)外观模式
1、描述
外观模式一般也被叫做门面模式,主要作用就是为客户端调用提供一套统一调用的门面接口。可以屏蔽下游服务的复杂性,是客户端的调用更加简单。
2、模式结构和实现逻辑
- 外观角色:此角色需要知道下游服务的功能和责任,对客户端提供统一调用接口,再将客户端的请求委派到各个下游服务去。
- 子服务角色:下游服务,提供外观角色实际调用的功能。子服务并不需要知道外观角色的存在,外观角色相当于子服务角色的客户端。
3、实战代码
我们这里模拟下 docker-compose up -d 一键启动多个服务功能。
/**
* 子服务角色
*
* @author Eajur.Wen
* @version 1.0
* @date 2022-11-15 16:35:50
*/
public class NginxServer {
public void startNginx() {
System.out.println("Nginx Server 启动");
}
}
/**
* 子服务角色
*
* @author Eajur.Wen
* @version 1.0
* @date 2022-11-15 16:35:50
*/
public class TomcatServer {
public void startTomcat() {
System.out.println("Tomcat Server 启动");
}
}
/**
* 子服务角色
*
* @author Eajur.Wen
* @version 1.0
* @date 2022-11-15 16:35:50
*/
public class WebServer {
public void startWeb() {
System.out.println("Web Server 启动");
}
}
/**
* 外观角色
*
* @author Eajur.Wen
* @version 1.0
* @date 2022-11-15 16:38:45
*/
public class ServerFacade {
private NginxServer nginxServer = new NginxServer();
private TomcatServer tomcatServer = new TomcatServer();
private WebServer webServer = new WebServer();
public void startServer() {
tomcatServer.startTomcat();
webServer.startWeb();
nginxServer.startNginx();
}
}
/**
* 测试类
*
* @author Eajur.Wen
* @version 1.0
* @date 2022-11-15 16:41:56
*/
public class Client {
public static void main(String[] args) {
// 原始启动方式
NginxServer nginxServer = new NginxServer();
TomcatServer tomcatServer = new TomcatServer();
WebServer webServer = new WebServer();
tomcatServer.startTomcat();
webServer.startWeb();
nginxServer.startNginx();
System.out.println("-------------------");
// 外观模式启动方式
ServerFacade serverFacade = new ServerFacade();
serverFacade.startServer();
}
}
执行结果:
根据实战例子,我们发现外观模式能解除客户端和各个子服务的耦合,简化客户端繁琐的调用方式。
4、适用场景
- 需要区分内部接口和对外接口时,使用外观模式把需要暴露的接口放到外观角色即可。
- 需要解除客户端和子服务的耦合时。