目录

  • 前言
  • 1 定义
  • 2 适用性
  • 3 结构
    • 3.1 结构图
    • 3.2 参与者
  • 4 Spring实际应用举例
    • 4.1 Client——我们定义的启动类
    • 4.2 Facade——SpringApplication.run()方法
    • 4.3 subSystem——ResourceLoader
  • 5 总结
  • 参考文献

前言

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

设计模式——Facade(外观)模式相关推荐

  1. php5.1 facade,php设计模式 Facade(外观模式)

    模式定义:外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加 ...

  2. [php]php设计模式 Facade(外观模式)

    1 <?php 2 /** 3 * 外观模式 示例 4 * 5 * 为子系统中的一组接口提供一个一致的界面,定义一个高层接口,使得这一子系统更加的容易使用 6 */ 7 class SubSyt ...

  3. 设计模式之外观模式(Facade)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  4. 设计模式笔记 10.Facade 外观模式(结构型模式)

    10. Facade 外观模式      2008-8-18 动机(Motivation) 上述A方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种 ...

  5. 设计模式10: Facade 外观模式(结构型模式)

    Facade 外观模式(结构型模式) 系统的复杂度 假设我们要开发一个坦克模式系统用于模拟坦克车在各种作战环境中的行为,其中坦克系统由引擎.控制器.车轮.车身等各个子系统构成. internal cl ...

  6. 如何让孩子爱上设计模式 ——11.外观模式(Facade Pattern)

    如何让孩子爱上设计模式 --11.外观模式(Facade Pattern) 标签: 设计模式初涉 场景引入 相信各位玩过LOL英雄联盟游戏的童鞋,对下面两个英雄都不会陌生吧:       分别是瑞雯和 ...

  7. 研磨设计模式之外观模式(Facade)(解决方案)

    3.2  解决方案 3.2.1  外观模式来解决 用来解决上述问题的一个合理的解决方案就是外观模式.那么什么是外观模式呢? (1)外观模式定义 这里先对两个词进行一下说明,一个是界面,一个是接口. 界 ...

  8. 设计模式学习之---Facade(外观)模式

    1.Facade外观模式,是一种接口型模式.这种模式的目的在于,它为子系统中的一组接口,定义了一个更高层次的接口,通过这个接口,提供一个统一的接口,使子系统更加容易使用. 2.实现:创建一个新的类,提 ...

  9. Facade外观模式

    Facade外观模式,是一种结构型模式,它主要解决的问题是:组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战.在这里我想举一个例子: ...

  10. 移动开发 | Swift 中的设计模式 #3 外观模式与适配器模式

    本文是我的设计模式系列教程的第三篇.在第一篇文章中,我介绍了 创建型模式中的工厂模式和单例模式.在第二篇文章中,又讨论了一下 行为型模式中的观察者模式和备忘录模式. 在本文中,我会就结构型模式中的外观 ...

最新文章

  1. Android 画虚线边框
  2. canal 监听不到数据变化_数据的异构实战(二)手写迷你版同步工程
  3. WP7上Metro风格的程序栏图标汇总
  4. json解析数组 nlohmann_JSON 数组的遍历解析
  5. 在echarts图表外调用echarts的下载功能以及echarts getDataURL图表数据不显示的问题的解决方案...
  6. LeetCode 705 Design HashSet 解题报告
  7. jsp管理系统页面模板_jsp+ssh(spring+struts2+hibernate)+mysql实现的高校实验室管理系统...
  8. JAVA 简单的抽奖程序
  9. aws dynamodb_如何使用AWS Lambda将DynamoDB集成到您的API中
  10. java代码继承------多层继承
  11. neo4j 如何删除所以的节点和关系
  12. NH2-UiO-66|CAS号1260119-00-3金属有机骨架
  13. 修路【NOIP2016提高组模拟】
  14. 使用esp32-s2模拟实现usb多点触摸
  15. 【NOI2017模拟3.30】原谅
  16. Angular primeng tree 组件数据解析(适用于Angular2+)
  17. 【Ruby on Rails全栈课程】4.3 评论功能实现(二)--创建帖子详情页面
  18. HTML——标签_1(文本格式化)
  19. 【CodeForces - 1647D】Madoka and the Best School in Russia(分类讨论,因数分解)
  20. Java:中序线索化二叉树及遍历

热门文章

  1. 手把手一步步用DataGridView 控件编写属于自己的日历
  2. aliez歌词_aLIEz (中文版)歌词
  3. zebra 斑马打印机 打印图片
  4. 桥连模式,模板模式的改进
  5. oracle财务系统表,Oracle ERP 财务模块表结构.ppt
  6. 腾讯力作!iOS 9 人机界面指南(5):图标与图形设计
  7. [雷霄骅]修改了一个YUV/RGB播放器
  8. HUAWEI HiCar让华为手机用户中的宝马车主Hi起来!
  9. 从辉煌走向消亡(下)——小型机之王DEC公司
  10. matlab qpsk代码 博客,完整版QPSK调制原理及matlab程序实现