Bootstrap

设计模式——Facade(外观)模式

前言

我们通常会遇到调用一个复杂子系统,而当这个子系统进行更新或其它改进时,将不可避免的影响我们的代码。而Facade就是一种可以帮助我们对复杂子系统进行解耦的一种模式。

1 定义

Facade模式:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这一接口使得对子系统的使用更加方便。

2 适用性

  • 当需要为一个复杂子系统提供一个简单的接口时。
  • 当客户端的代码需要和抽象的实现进行解耦时
  • 当需要建立一个有层次的子系统时,子系统之间的通信可以仅仅通过facade进行,大大降低耦合。

3 结构

3.1 结构图

在这里插入图片描述

3.2 参与者

上图定义内容解释如下:

  • Client:客户端,使用依赖Facade的对象。
  • Facade:抽象接口,知道哪些子系统负责处理哪些请求,将请求实际转发给子系统处理(有点像Adapter模式进行接口的转换)。
  • subSystemxx:子系统,实现子系统的功能;处理Facade指派的任务;不存储Facade的任何信息。

4 Spring实际应用举例

spring中处处可见Facade模式。比如springboot的启动其实就可以看作Facade模式

4.1 Client——我们定义的启动类

启动类示例:

@SpringBootApplication
@EnableScheduling
@EnableAspectJAutoProxy
public class ThemeleafApplication {

    public static void main(String[] args) {
        SpringApplication.run(ThemeleafApplication.class, args);
    }

}

4.2 Facade——SpringApplication.run()方法

该run方法封装了各种启动流程比如:容器建立、bean工厂设置、环境设置,监听器、处理器设置、上下文环境刷新和实例化单例非延迟bean等。
在这里插入图片描述
具体启动内容可以参考spring源码。

4.3 subSystem——ResourceLoader

这里以子系统ResourceLoader为例,该接口定义和实现类如下:
在这里插入图片描述
在spring容器中该接口提供了一个统一接口用于访问各种资源(如:文件、流、网络url资源等等,相当于Facade的一个资源访问子系统。

5 总结

Facade模式主要用于简化客户调用各种子系统的过程和解耦它们的联系,还可以用于开发时各种模块的划分,比如提供Facade模块暴露给客户我们复杂的底层处理功能。

参考文献

[1]. 《设计模式》

;