门面设计模式: response中getWriter方法就是封装了outputStream

三个角色:子系统角色,门面角色,客户端角色。持有对方的实例。

门面设计模式相当于聚合层,就像云鹊的api-ws微服务。

子系统中有些方法对外提供暴露,有些方法仅仅对其他子系统提供。

在哪些情况下使用门面设计模式?

医院的例子

现代的软件系统都是比较复杂的,设计师处理复杂系统的一个常见方法便是将其"分而治之",把一个系统划分为几个较小的子系统。如果把医院作为一个子系统,按照部门职能,这个系统可以划分为挂号、门诊、划价、化验、收费、取药等。看病的病人要与这些部门打交道,就如同一个子系统的客户端与一个子系统的各个类打交道一样,不是一件容易的事情。

首先病人必须先挂号,然后门诊。如果医生要求化验,病人必须首先划价,然后缴费,才可以到化验部门做化验。化验后再回到门诊室。

解决这种不便的方法便是引进门面模式,医院可以设置一个接待员的位置,由接待员负责代为挂号、划价、缴费、取药等。这个接待员就是门面模式的体现,病人只接触接待员,由接待员与各个部门打交道。

门面模式的结构

门面模式没有一个一般化的类图描述,最好的描述方法实际上就是以一个例子说明。

由于门面模式的结构图过于抽象,因此把它稍稍具体点。假设子系统内有三个模块,分别是ModuleA、ModuleB和ModuleC,它们分别有一个示例方法,那么此时示例的整体结构图如下:

在这个对象图中,出现了两个角色:

1,门面(Facade)角色 :客户端可以调用这个角色的方法。此角色知晓相关的(一个或者多个)子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。

2,子系统(SubSystem)角色 :可以同时有一个或者多个子系统。每个子系统都不是一个单独的类,而是一个类的集合(如上面的子系统就是由ModuleA、ModuleB、ModuleC三个类组合而成)。每个子系统都可以被客户端直接调用,或者被门面角色调用。子系统并不知道门面的存在,对于子系统而言,门面仅仅是另外一个客户端而已。

//门面角色
public class Facade {ModuleA a = new ModuleA();ModuleB b = new ModuleB();ModuleC c = new ModuleC();//示意方法,满足客户端需要的功能public void test() {a.testA();b.testB();c.testC();}/*** 下面这些是A、B、C模块对子系统外部提供的方法*/public void a1(){a.a1();}public void b1(){b.b1();}public void c1(){c.c1();}
}
//客户端角色类
public class Client {public static void main(String[] args) {Facade facade = new Facade();facade.test();}
}

Facade类其实相当于A、B、C模块的外观界面,有了这个Facade类,那么客户端就不需要亲自调用子系统中的A、B、C模块了,也不需要知道系统内部的实现细节,甚至都不需要知道A、B、C模块的存在,客户端只需要跟Facade类交互就好了,从而更好地实现了客户端和子系统中A、B、C模块的解耦,让客户端更容易地使用系统。

使用门面模式还有一个附带的好处,就是能够有选择性地暴露方法。一个模块中定义的方法可以分成两部分,一部分是给子系统外部使用的,一部分是子系统内部模块之间相互调用时使用的。有了Facade类,那么用于子系统内部模块之间相互调用的方法就不用暴露给子系统外部了。

//子系统角色
public class ModuleA {//示意方法public void testA(){System.out.println("调用ModuleA中的testA方法");}/*** 提供给子系统外部使用的方法*/public void a1(){};/*** 子系统内部模块之间相互调用时使用的方法*/private void a2(){};private void a3(){};}

这样定义一个ModuleFacade类可以有效地屏蔽内部的细节,免得客户端去调用Module类时,发现一些不需要它知道的方法。比如a2()和a3()方法就不需要让客户端知道,否则既暴露了内部的细节,又让客户端迷惑。对客户端来说,他可能还要去思考a2()、a3()方法用来干什么呢?其实a2()和a3()方法是内部模块之间交互的,原本就不是对子系统外部的,所以干脆就不要让客户端知道。

一个系统可以有几个门面类

在门面模式中,通常只需要一个门面类,并且此门面类只有一个实例,换言之它是一个单例类。当然这并不意味着在整个系统里只有一个门面类,而仅仅是说对每一个子系统只有一个门面类。或者说,如果一个系统有好几个子系统的话,每一个子系统都有一个门面类,整个系统可以有数个门面类。

为子系统增加新行为

初学者往往以为通过继承一个门面类便可在子系统中加入新的行为,这是错误的。门面模式的用意是为子系统提供一个集中化和简化的沟通管道,而不能向子系统加入新的行为。比如医院中的接待员并不是医护人员,接待员并不能为病人提供医疗服务。

门面模式的优点

1,松散耦合: 门面模式松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护。

2,简单易用: 门面模式让子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟门面类交互就可以了。

3,更好的划分访问层次: 通过合理使用Facade,可以帮助我们更好地划分访问的层次。有些方法是对系统外的,有些方法是系统内部使用的。把需要暴露给外部的功能集中到门面中,这样既方便客户端使用,也很好地隐藏了内部的细节。

20201102 门面设计模式相关推荐

  1. Java中的门面设计模式,非常有用!

    门面设计模式又叫外观设计模式,其核心思想正如其字面意思,向用户提供一个门户,用户只需要访问这个门户来获取他们想要的数据,无需管理这个门户内部的构成,也无需知道里面的运行流程等等,对于开发者来说,使用门 ...

  2. 门面设计模式(Facade Pattern)

    GOF设计模式 Facade Pattern 门面设计模式 门面模式例子:我有一个专业的Nikon相机,我就喜欢自己手动调光圈.快门,这样照出来的照片才专业,但MM可不懂这些,教了半天也不会.幸好相机 ...

  3. Python门面设计模式

    理解结构设计模式 1.结构型模式描述如何将对象和类组合成更大的结构 2.结构型模式是一种能够简化设计工作的模式,因为它能够找出更简单的方法来认识或表示实体之间的关系.在面向对象世界中,实体指的是对象或 ...

  4. 门面设计模式(facade)

    门面设计模式(facade) 这个贼鸡儿简单,快看两眼,这是我介绍的最后两个设计模式了!坚持,成功一定是属于你的! 这个设计模式叫个啥?门面设计模式??这又是什么玩意(消音ing),好了好了我举个例子 ...

  5. 11【门面设计模式】

    文章目录 十一.门面设计模式 11.1 门面设计模式简介 11.1.1 门面设计模式概述 11.1.2 门面设计模式中的角色 11.2 门面设计模式的实现 11.3 门面设计模式的优缺点 十一.门面设 ...

  6. Java中的门面设计模式

    门面设计模式又叫外观设计模式,其核心思想正如其字面意思,向用户提供一个门户,用户只需要访问这个门户来获取他们想要的数据,无需管理这个门户内部的构成,也无需知道里面的运行流程等等,对于开发者来说,使用门 ...

  7. 抽丝剥茧——调停者和门面设计模式

    调停者和门面设计模式 今天我们来聊两个设计模式:调停者设计模式和门面设计模式,为什么要将他们放在一起讲解,因为他们两个东东太像了,仅仅是由于作用的地方不同而产生的不同的叫法. 我们用一个对于我们90后 ...

  8. 软件设计模式-门面设计模式

    门面设计模式 门面模型(facade pattern)又称外观模型,为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用,简而言之就是把一堆复 ...

  9. 20191219 门面设计模式

    门面设计模式 外部与一个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式. 使用哪种设计模式属于详细设计. 门面模式就是动里不动外,让外层好调用.使用门面设计模式. 门面设计 ...

最新文章

  1. Django中Mysql数据库的使用
  2. Android Jetpack组件之ViewModel使用
  3. wxWidgets:工具栏概述
  4. 手把手教你Chrome浏览器安装Postman(含下载云盘链接)【转载】
  5. MySQL中索引的分类和基本操作
  6. linux 内核开发_25年Linux内核开发中的9课
  7. 三种代理服务器以及反向代理详解
  8. tp5ajax即点即改,TP5中即点即改,json分页,单删
  9. 阿里线上bug排查命令
  10. 关于nginx rtmp的一点配置
  11. CentOS 7 / RHEL 7 上安装 LAMP + phpMyAdmin
  12. Java中的>>,>>>
  13. 前端框架TopJUI使用心得
  14. 强化物联网连接 Silicon Labs收购Micrium
  15. Spring Cloud入门-Oauth2授权之JWT集成(Hoxton版本)
  16. 【歌词】ASIAN KUNG-FU GENERATION - ムスタング(mix for 芽衣子)
  17. 电脑免费录屏软件有哪些?5款视频录制软件免费版
  18. 下厨房(istringstream的使用)----网易2017内推笔试编程题合集
  19. 点餐APP 冲刺一总结
  20. foxmail远程主机强迫关闭了一个现有的连接

热门文章

  1. 模糊搜索——Vue单页面-Element UI
  2. H12-223 31-60(解析)
  3. c语言数论应用有关题目,中学数学中及初等数论相关的几个问题.docx
  4. 宿舍管理系统(精简版)
  5. panda3d 键盘移动场景
  6. CdTe量子点及与牛血清蛋白的偶联/CdTe量子点与CLV3信号多肽片段偶联/GSH-CdTe量子点与溶菌酶的偶联
  7. P3646 [APIO2015]巴厘岛的雕塑
  8. 计算机应用基础实验指导实验八,计算机应用基础第八章上机实验
  9. PXC SST 同步异常trabackup_checkpoints missing. xtrabackup/SST failed on DONOR. Check DONOR log
  10. 斯坦福大学开发PETE装置吸收60%的太阳能