文章目录

  • 十一、门面设计模式
    • 11.1 门面设计模式简介
      • 11.1.1 门面设计模式概述
      • 11.1.2 门面设计模式中的角色
    • 11.2 门面设计模式的实现
    • 11.3 门面设计模式的优缺点

十一、门面设计模式

11.1 门面设计模式简介

11.1.1 门面设计模式概述

门面模式(Facade Pattern):也叫外观设计模式,该模式对外有一个统一接口,用来访问子系统中的一群接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。

其实我们在写代码时,有意无意的都在大量的使用门面设计模式,但凡高层模块需要调度多个子系统时,我们都会自觉的创建一个新类来封装这些子系统,提供精简的调用方式,让高层模块可以更加容易地间接调用这些子系统的功能;包括我们以前编写的Utils工具类、拦截器、过滤器、网关等都是提供一个调用入口,由这些门面来负责调用复杂的子系统;

门面设计模式主要解决的问题就是:降低访问复杂系统的内部子系统时的复杂度,简化客户端之间的接口。

Tips:门面设计模式就是迪米特法则的具体应用;

11.1.2 门面设计模式中的角色

门面设计模式具备如下几个角色:

  • 1)门面角色(Facade):各子系统对外的统一接口,整合各个子系统;
  • 2)子系统角色(SubSystem):实现系统的部分功能,客户通过Facade访问它。

11.2 门面设计模式的实现

【案例】

照顾小孩子需要负责小孩子的饮食起居,包括做饭,洗衣服,遛孩子等等…带一个小孩子非常麻烦,于是我们请到一个保姆来帮助我们干这些事情;

UML类图如下:

  • 子系统角色1-照顾小孩类:
package com.patter.demo;/*** @author lscl* @version 1.0* @intro: 带孩子-子系统*/
public class CareChild {public void doCareChild(String destName) {System.out.println("遛孩子,带孩子【" + destName + "】...");}
}
  • 子系统角色2-做饭类:
package com.patter.demo;/*** @author lscl* @version 1.0* @intro: 做饭-子系统*/
public class Cooking {public void doCooking(String menu) {System.out.println("【给孩子吃" + menu + "】");}
}
  • 子系统角色3-洗衣服类:
package com.patter.demo;/*** @author lscl* @version 1.0* @intro: 换洗衣服-子系统*/
public class Laundry {public void doLaundry(){System.out.println("帮孩子换洗衣服...");}
}
  • 门面角色-保姆类:
package com.patter.demo;/*** @author lscl* @version 1.0* @intro: 保姆-门面角色*/
public class BabySister {private CareChild careChild = new CareChild();private Cooking cooking = new Cooking();private Laundry laundry = new Laundry();// 带孩子经费private Double money = 4000.0D;public BabySister(Double money) {this.money = money;}public BabySister() {}/*** 带孩子*/public void careChild() {if (money < 5000.0D) {careChild.doCareChild("省内游");} else if (money >= 5000 && money < 8000) {careChild.doCareChild("国内游");} else if (money >= 8000) {careChild.doCareChild("全球游");}}/*** 做饭*/public void cooking() {if (money < 5000) {cooking.doCooking("大白菜,豆芽菜");} else if (money >= 5000 && money < 8000) {cooking.doCooking("小青菜,辣椒炒肉");} else if (money >= 8000) {cooking.doCooking("小青菜,辣椒炒肉,糖醋排骨");}}/*** 洗衣服*/public void laundry() {laundry.doLaundry();}
}

11.3 门面设计模式的优缺点

门面设计模式和我们之前的代理设计模式有些许类似,但是却有本质上的不同,代理设计模式主要关注的是对一个类的增强或保护,门面设计模式则是对多个子系统的统一管理;

  • 优点:

    • 1)简化系统的调用过程,用户不需要对子系统有很深的了解,以免给子系统带来风险,符合迪米特法则
    • 2)减少系统依赖,降低耦合
  • 缺点:
    • 1)当子系统升级或扩展时,可能会给门面角色带来未知的风险(门面角色和子系统耦合)
    • 2)当新增子系统时需要添加到门面角色中(修改门面角色),不符合开闭原则
    • 3)在某些情况下,可能违反单一职责原则

11【门面设计模式】相关推荐

  1. 简易的动物园管理系统之Java8流式API的重构代码(使用 门面设计模式)

    文章目录 前言 之前的文章 本次的源码 AnimalTypeEnum SexEnum Animal AnimalFactory BaseAnimal Bird Cat Dog Fish AddAnim ...

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

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

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

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

  4. Python门面设计模式

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

  5. 门面设计模式(facade)

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

  6. Java中的门面设计模式

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

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

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

  8. 20201102 门面设计模式

    门面设计模式: response中getWriter方法就是封装了outputStream 三个角色:子系统角色,门面角色,客户端角色.持有对方的实例. 门面设计模式相当于聚合层,就像云鹊的api-w ...

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

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

最新文章

  1. MongoDB 维护Replica Set
  2. 基于Python的频谱分析(一)
  3. 少儿编程python教材_少儿编程|Python环境安装
  4. python安装第三方库-安装第三方模块
  5. No error message available, result code: E_FAIL(0x80004005)
  6. php数组添加数组_PHP数组
  7. 【STM32】 STM32驱动URM04超声波测距模块
  8. mysql 权限管理无效_mysql 权限控制笔记
  9. python torchvision_pip install torchvision error:安装版本为0.4.1的torch后继续安装torchvision报错...
  10. 输入一个十进制数N,将它转换成R进制数输出(运用递归实现)
  11. 前端面试之你可能会遇到的编程题(1)
  12. rabbitmq direct 多个消费者_rabbitMQ消息队列入门介绍
  13. Python3 发票导出XML转Excel
  14. java opencv 打开图片路径_Java 调用 OpenCV (可获取到图像)
  15. 陕西2020行政区划调整_陕西省最新行政区划,厉害了大陕西
  16. springboot整合银联支付B2C
  17. teamviewer 服务器系统,远程支持服务器搭建teamviewer
  18. 密码学——对称加密加密模式
  19. 解决:jar解压缩之后,图标变白的问题
  20. 扇贝编程可以用c语言吗,扇贝编程手机版下载_扇贝编程app下载 v1.1.41 - 87G手游网...

热门文章

  1. java oval_Java对象校验框架Oval怎么使用 | 学步园
  2. OpenLayers 加载天地图模糊的问题 OpenLayers 地图缩放模糊
  3. 4月刊特别推荐:架构师接龙:岳旭强 VS. 杨卫华
  4. Maya: 菜单Create Subdiv Primitives Sphere
  5. 济宁商业学校计算机,济宁商业学校2021年招生录取分数线
  6. c语言上交源代码怎么交啊,C语言问题在线等啊作业提交上交的的内容必须由以下两个部分组成,缺 爱问知识人...
  7. C语言 精典数值算法程序合集
  8. NOIP 2012 国王游戏
  9. Python自学第5周反馈:python做多元回归分析,预测某支股票未来的最高最低价
  10. [计算机动画]Games103-作业1-刚体动画