【设计模式】第九章:外观模式(门面模式)详解及应用案例

news/2024/11/17 16:13:19/

系列文章

【设计模式】七大设计原则
【设计模式】第一章:单例模式
【设计模式】第二章:工厂模式
【设计模式】第三章:建造者模式
【设计模式】第四章:原型模式
【设计模式】第五章:适配器模式
【设计模式】第六章:装饰器模式
【设计模式】第七章:代理模式
【设计模式】第八章:桥接模式
【设计模式】第九章:外观模式 / 门面模式
【设计模式】第十章:组合模式
【设计模式】第十一章:享元模式
【设计模式】第十二章:观察者模式
【设计模式】第十三章:模板方法模式
【设计模式】第十四章:策略模式
【设计模式】第十五章:责任链模式
【设计模式】第十六章:迭代器模式
【设计模式】第十七章:状态模式
【设计模式】第十八章:备忘录模式
【设计模式】第十九章:访问者模式
【设计模式】第二十章:解释器模式
【设计模式】第二十一章:命令模式
【设计模式】第二十二章:中介者模式


文章目录

  • 系列文章
  • 一、定义
  • 二、角色分类
  • 三、实现方式
    • UML图
    • 具体实现
  • 四、应用场景
  • 五、优缺点
    • 优点
    • 缺点


一、定义

摘自百度百科: 是指提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使得子系统更容易使用。


二、角色分类

外观角色(Facade)

也被称为门面角色,是系统对外的统一接口

子系统角色(SubSystem)

子系统可以为多个,其并不知道外观角色的存在

客户角色(Client)

调用方法的角色


三、实现方式

UML图

Image.png

具体实现

我们在现实中就有相应的例子,假如我们有一个开关板,然后当我们点它的时候就会执行一系列的操作,接下来我们使用代码实现一下

外观角色(Facade)

public class SwitchBoard {private final CircuitA circuitA = new CircuitA();private final CircuitB circuitB = new CircuitB();private final CircuitC circuitC = new CircuitC();public void start() {circuitA.start();circuitB.start();circuitC.start();}
}

CircuitA

子系统角色(SubSystem)

public class CircuitA {public void start() {System.out.println("点开电路A");}
}public class CircuitB {public void start() {System.out.println("打开电路B");}
}public class CircuitC {public void start() {System.out.println("打开电路C");}
}

客户角色(Client)

public class Client {public static void main(String[] args) {SwitchBoard switchBoard = new SwitchBoard();switchBoard.start();}
}

运行结果

打开电路A
打开电路B
打开电路C

四、应用场景

以下部分内容摘自菜鸟教程

意图: 为子系统的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这个子系统更加容易使用

主要解决: 降低访问复杂系统的内部子系统的复杂度,简化客户端之间的接口

何时使用:

  1. 客户端不需要知道系统内部的复杂联系,整个系统只需要提供一个“接待员”即可
  2. 定义系统的入口

如何解决: 客户端不与系统耦合,外观类与系统耦合

关键代码: 在客户端与复杂系统之间再加一层,这一层将调用顺序、依赖关系处理好

应用实例:

  1. 去医院看病,可能要挂号、门诊、划价、取药等,让患者或其家属觉得很复杂,如果有提供接待人员,只让接待人员处理就会很方便
  2. Java的三层开发模式

适用场景:

  1. 为复杂的模块或子系统提供外界访问的模块
  2. 子系统相对独立
  3. 预防低水平人员带来的风险

注意事项: 在层次化结构中,可以使用外观模式定义系统中每层的入口


五、优缺点

优点

  1. 减少系统相互依赖
  2. 提高灵活性
  3. 提高安全性

缺点

不符合开闭原则,如果要改东西很麻烦,继承和重写都不合适


http://www.ppmy.cn/news/744435.html

相关文章

闲谈IPv6-IPv6的分片(IPv6 Fragment)

从去年9月初以来,我把做实验写博客写代码的时间放在了晚上,但是现在,晚上要早睡觉,白天要被指使着干这干那,感觉还是周六的凌晨更是自己的时间。 本文最后,夹杂着一则关于 “皮鞋为什么比布鞋落后&#xf…

判断一个key在redis集群的哪一个节点(分片)

redis的集群模式下去需要确定一个key在哪个节点上的话,简单粗暴的就是一个个节点找过去。但是这样明显是费时费力的。 其实可以直接确定这个key在redis的哪个节点上,然后直接去这个节点找这个key就可以了. 1-先查看集群的几个节点的分片范围情况 ./re…

AI“看片儿”比人快,鉴黄师却说不靠谱?

本文转载自钛媒体 一直以来,“鉴黄师”被认为是一种神秘且高薪的职业,很多普通人都对这个职业充满了好奇,甚至有人想做个兼职,以为轻轻松松就能赚钱,但这个职业真的是“钱多事少”吗? 事实上,…

从Wireshark抓包来看IP分片

文件来自于前几天CyBRICS 2021中的lx100题目,因为做题时候被IP分片坑到了,发现自己对于网络这一块的知识掌握的并不好,所以写一篇文章来理一下。为了省事就直接用比赛的pcap文件做样例了:点击。 从Wireshark抓包来看IP分片 UDP/…

卧槽!这 TM 才是真正的老司机看片神器!!!

今天给大家介绍一款特别的看剧网站,这个奈飞星网站可以直接免费观看Netflix上的资源。 这个网站,所有的资源都是超清画质,可以说这个网站是观看画质最高清的一个网站了。 至于电影的加载速度,在正常网络环境下,非常流畅…

了解和搭建zabbix 6.0(来日方长)

前言: 作为一个运维,需要会使用监控系统查看服务器系统性能、应用服务状态和网站流量指标等,利用监控系统的数据去了解网站上线发布的结果和健康状态。 利用一个优秀的监控软件,我们可以: 通过一个友好的界面进行浏览整个网站所有…

[RapidVideOCR周边] RapidVideOCR初级教程(界面版 下载解压即可使用)

引言 考虑到提取视频字幕的小伙伴大多不是程序员行当,为了降低使用门槛,特此推出界面版的RapidVideOCR Desktop.RapidVideOCR Desktop需要搭配VideoSubFinder使用。它们两个关系如下图所示: #mermaid-svg-keuknVOG1YkfjOkw {font-family:&qu…

华为G9怎么找到云相册_华为云相册,三大亮点功能助力P9摄影新体验

原标题:华为云相册,三大亮点功能助力P9摄影新体验 【前言】:徕卡相机时代,大家用老相册保存照片。华为P9,携手徕卡跨进智能拍摄新时代时,还布局了“华为智能云相册”。华为云相册,不仅可以帮助用户保存海量…