目录
前言
我们通常会遇到调用一个复杂子系统,而当这个子系统进行更新或其它改进时,将不可避免的影响我们的代码。而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]. 《设计模式》