Loading

软件设计模式白话文系列(十)外观模式

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、适用场景

  • 需要区分内部接口和对外接口时,使用外观模式把需要暴露的接口放到外观角色即可。
  • 需要解除客户端和子服务的耦合时。
posted @ 2022-11-15 22:59  Eajur  阅读(50)  评论(0)    收藏  举报