当前位置: 首页 > news >正文

【设计模式】深入解析设计模式:门面模式(外观模式)的定义、优点和代码实现

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


门面模式(外观模式)


SLF4J是门面模式的典型应用(但不仅仅使用了门面模式)。


门面模式定义


门面模式Facade Pattern)又称为外观模式,提供了一个统一的接口,用来访问子系统中的一群接口

其主要特征是定义了一个高层接口,让子系统更容易使用。

在这里插入图片描述


门面模式主要包含2种角色

  • 外观角色(Facade)

    • 也称门面角色,系统对外的统一接口。
  • 子系统角色(SubSystem)

    • 可以同时有一个多个 SubSystem
    • 每个SubSystem不是一个单独的类,而是一个类的集合
    • SubSystem并不知道Facade的存在,对于SubSystem而言,Facade只是另一个客户端而已(即FacadeSubSystem透明)。
  1. 比如去医院看病,可能要去挂号、门诊、化验、取药,让患者或患者家属觉得很复杂;
  2. 如果有提供接待人员,只让接待人员来处理,就很方便。

在这里插入图片描述


门面模式的实现


场景:回家,我们会开各个屋的灯。离开家时,会关闭各个屋的灯

如果家里设置一个总开关,来控制整个屋的灯就会很方便。

我们使用门面模式的实现


我们先来定义一个灯接口

在这里插入图片描述


接下里,我们定义 Light 的子系统 SubSystem ;

可以有多个 SubSystem ,这里定义两个类:LivingRoomLight,BedRoomLight

在这里插入图片描述


在这里插入图片描述


接下来,我们定义外观角色(Facade),用于打开所有的灯或者关闭所有的灯:

在这里插入图片描述


外观角色需要操控 LivingRoomLightBedRoomLight 这两个子系统,所以也要有子系统 on()off() 对应的方法:

在这里插入图片描述


上面为了方便,直接在外观角色中实现了 Light 接口,但是我们也可以不实现,都是可以的:

门面模式是设计思想的一种,重思想,轻代码实现

在这里插入图片描述


在这里插入图片描述


这时候,我们需要 main 方法来表示客户端:

在这里插入图片描述

不使用门面模式,我们开关灯的客户端写法如上图所示;


如果我们引入门面模式:

在这里插入图片描述

并且通过门面模式,我们修改子系统的内容,并不会影响客户端 Main 的使用;


门面模式的优点


  • 减少了系统的相互依赖,实现了客户端与子系统的耦合关系,这使得子系统的变化不会影响到调用它的客户端;
  • 提高了灵活性,简化了客户端对子系统的使用难度,客户端无需关心子系统的具体实现方式,而只需要和门面对象交互即可。
  • 提高了安全性。可以灵活设定访问权限,不在门面对象中开通方法,就无法访问。

在这里插入图片描述

在这里插入图片描述

相关文章:

  • 383. 赎金信
  • 【Git】-- 处理 Git 提交到错误分支的问题
  • 深入理解哈希优化策略与TypeScript实现
  • 【LeetCode Solutions】LeetCode 111 ~ 115 题解
  • 快速构建个人本地知识库管理系统与实现RAG问答
  • JVM面试专题
  • JavaScript 事件流与事件委托
  • VMware Workstation下载,母盘安装,启动的设置,克隆,其他(详细图文)
  • 双重token自动续期解决方案
  • Forking Workflow 详解
  • C语言基础知识10---栈、队列、树
  • leetcode 169.Majority Element
  • window离线全局安装yarn
  • 【Rtklib入门指南】4. 使用RTKLIB进行载波相位差分定位(RTK)
  • Scala(2)
  • QT学习day1
  • 计算机视觉——传统数字图像处理中图像去噪原理与代码实现细节
  • 全长约8.3公里!宁波象山港跨海大桥南中塔柱云端合龙
  • 十五届蓝桥杯省赛Java B组(持续更新..)
  • 蓝桥杯专项复习——二分
  • 定制开发网站多少钱/网络推广公司服务内容
  • 赣州网上房地产备案网/宁波seo优化报价多少
  • 大良营销网站建设价位/天眼查企业查询入口
  • 站长seo计费系统/怎么制作网页推广
  • 网站模式下做淘宝客/廊坊百度推广电话
  • 做网站需要购买地域名吗/怎样做好网络营销推广