【结构型模式】外观模式

​一、外观模式概述

        外观模式定义与意图外观类为复杂的子系统提供了一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。(对象结构型模式)

  • 外观模式的特点:
    • 1.又叫做门面模式;
    • 2.是迪米特法则的一种具体实现;
    • 3.通过引入一个新的外观角色来降低原有系统的复杂度,同时降低客户类与子系统的耦合度;
    • 4.所指的子系统是一个广义的概念,它可以是一个类,一个功能模块,系统的一个组成或者一个完整的系统。

  • 外观模式分析:
    • 1.一个客户类需要喝多个业务类交互,而这些需要交互的业务类经常会作为一个整体出现;
    • 2.引入一个新的外观类(Facade)来负责和多个业务类(子系统(Subsystem))进行交互,而客户类只需与外观类交互;
    • 3.为多个业务类的调用提供了一个统一的入口,简化了类与类之间的交互。
  • 外观模式的引入:
    • 1.没有外观类:每个客户类需要和多个子系统之间进行复杂的交互,系统的耦合度将很大;
    • 2.引入外观类:客户类只需要直接与外观类交互,客户类与子系统之间原有的复杂引用关系由外观类来实现,从而降低了系统的耦合度;
    • 3.一个子系统的外部与其内部的通信通过一个同意的外观类进行,外观类将客户类与子系统的内部复杂性分隔开,是得客户类只需要与外观角色打交道,而不需要与子系统内部得跟多对象打交道。
    • 4.简化接口:外观类为复杂的子系统提供了一个简单得访问入口
  • 模式优缺点:
    • 优点:
      • 1.它对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更容易;
      • 2.它实现了子系统与客户端之间的松耦合关系,这使得子系统的变化不会影响到调用它的客户端,只需要吊针给外观类即可;
      • 3.一个子系统的修改对其他子系统没有任何影响,而且子系统的内部比那花也不会影响到外观对象。
    • 缺点:
      • 1.不能很好地陷制客户端直接使用子系统类,如果客户端访问子系统类做太多的限制则减少了可变性和灵活性;
      • 2.如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则。
  • 模式适用环境:
    • 1.要为访问一系列复杂的子系统提供一个简单入口;
    • 2.客户端与多个子系统之间存在很大的依赖性;
    • 3.在层析结构中,可以使用外观模式的定义系统中每一层的入口,层与层之间不直接产生联系,二十通过外观类建立联系,降低层之间的耦合度。

二、代码实现

        外观模式结构包含两个角色:

  • 外观角色(Facade)
  • 子系统角色(Subsystem)

抽象外观类的动机:在标准的外观模式的结构图中,如果需要增加、删除或更换与外观类交互的子系统类,必需修改外观类或客户端的源代码,这将违背开闭原则,因此可以通过引入抽象外观类对系统进行改进,在一定程度上解决该问题。

        利用外观模式设计一个保安系统的,由录像机、电灯、红外线监控和警报器组成。保安系统的操作人员需要经常将这些仪器启动和关闭。保安类需要用到所有的录像机(Camera)、电灯(Light)、感应器(Sensor)和警报器(Alarm)对象,保安觉得使用不方便。编程实现并绘制该模式的UML图。

        2.1 外观角色(console以及实现console控制的接口Equipment)
package facade.securitySystem;
//开关接口
public interface Equipment {public void turnOn(); // 打开设备public void turnOff(); // 关闭设备
}
package facade.securitySystem;
//控制开关,外观类
public class Console {private Equipment camera = new Camera();private Equipment light = new Light();private Equipment sensor = new Sensor();private Equipment alarm = new Alarm();public void turnOnAll() {camera.turnOn();light.turnOn();sensor.turnOn();alarm.turnOn();}public void turnOffAll() {camera.turnOff();light.turnOff();sensor.turnOff();alarm.turnOff();}public void turnOnAlarm() {alarm.turnOn();}public void turnOffAlarm() {alarm.turnOff();}public void turnOnCamera() {camera.turnOn();}public void turnOffCamera() {camera.turnOff();}public void turnOnLight() {light.turnOn();}public void turnOffLight() {light.turnOff();}public void turnOnSensor() {sensor.turnOn();}public void turnOffSensor() {sensor.turnOff();}
}
        2.2 子系统角色(Alarm、Camera、Light、Sensor)
package facade.securitySystem;
//子系统报警
public class Alarm implements Equipment {@Overridepublic void turnOn() {// TODO 自动生成的方法存根System.out.println("打开警报器");}@Overridepublic void turnOff() {// TODO 自动生成的方法存根System.out.println("关闭警报器");}}
package facade.securitySystem;
//子系统录像机
public class Camera implements Equipment {@Overridepublic void turnOn() {// TODO 自动生成的方法存根System.out.println("打开录像机");}@Overridepublic void turnOff() {// TODO 自动生成的方法存根System.out.println("关闭录像机");}}
package facade.securitySystem;
//子系统灯
public class Light implements Equipment {@Overridepublic void turnOn() {// TODO 自动生成的方法存根System.out.println("打开电灯");}@Overridepublic void turnOff() {// TODO 自动生成的方法存根System.out.println("关闭电灯");}}
package facade.securitySystem;
//子系统传感器
public class Sensor implements Equipment {@Overridepublic void turnOn() {// TODO 自动生成的方法存根System.out.println("打开传感器");}	@Overridepublic void turnOff() {// TODO 自动生成的方法存根System.out.println("关闭传感器");}}
        2.3 main方法实现外观模式(Security)
package facade.securitySystem;
//保安
public class Security {public static void main(String[] args) {// TODO 自动生成的方法存根Console console = new Console();console.turnOnAll();console.turnOffAll();console.turnOnAlarm();console.turnOffAlarm();}}
        2.4 UML图

三、代码结构图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

试驾小米SU7后,我准备退了我的订单

文 | AUTO芯球 作者 | 雷歌 我真想退了我之前大定的小米SU7Pro版! 前两天我不是和朋友三人一起开着问界M9去试驾SU7了嘛, 说实话,这一圈下来,有欣喜有失望。 SU7的优点特别明显,也很突出, 就是它的底…

了解MySQL InnoDB多版本

了解MySQL InnoDB多版本 在数据库管理系统中,多版本并发控制(MVCC)是一种用于实现高并发和事务隔离的技术。MySQL的InnoDB存储引擎支持MVCC,这使得它可以在提供高事务性能的同时,也保证了数据的一致性和隔离性 MVCC简…

MySQL中的死锁预防和解决

MySQL中的死锁预防和解决 死锁是数据库管理系统中常见的问题,特别是在高并发的应用场景下。MySQL数据库中的死锁会导致事务处理速度减慢,甚至完全停止,因此理解并预防死锁至关重要。本文将详细介绍如何预防MySQL中的死锁,包括常用…

IBM SPSS Statistics for Mac:数据分析的卓越工具

IBM SPSS Statistics for Mac是一款功能强大的数据分析软件,专为Mac用户设计,提供了一系列专业的统计分析和数据管理功能。无论是科研人员、数据分析师还是学生,都能从中获得高效、准确的数据分析支持。 IBM SPSS Statistics for Mac v27.0.1…

Ubuntu 安装 wine

本文所使用的 Ubuntu 系统版本是 Ubuntu 22.04 ! 如果你使用 Ubuntu 系统,而有些软件只在 Windows 上运行,例如:PotPlayer,那么该如何在 Ubuntu 系统中使用到这些 Windows 的软件呢?答案是安装 wine。 简单的安装步骤如…

IDEA使用SCALA

一、在IDEA中下载插件 在设置->插件中找到scala,并下载。 下载完成后重启idea 二、在idea中创建spark的RDD操作项目 新建项目选中Scala。 创建完成后为项目添加java包,这个添加的是spark安装包中jars目录下的所有jar包 然后编写RDD操作 import or…

HBuilder真机调试检测不到荣耀Magic UI系列(包括手机和电脑)解决办法

HBuilder真机调试检测不到荣耀Magic UI系列(包括手机和电脑)解决办法解决方法: 1.在开发人员选项中开启USB调试 如何进入开发者选项? 设置->关于->版本号,点击版本号直至出现您已处于开发者模式 2.选择USB配置…

【SQL每日一练】分组过滤练习题

文章目录 前言MySQL语法注意: 前言 题目:现在运营想查看每个学校用户的平均发贴和回帖情况,寻找低活跃度学校进行重点运营,请取出平均发贴数低于5的学校或平均回帖数小于20的学校。 drop table if exists user_profile; CREATE …

37-2 Python 的 requests 库发送 POST 请求

准备 sqlilabs 靶场: 构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、发送 POST 请求 首先使用bp对 sqlilabs 靶场的第12关抓个包,了解这个关卡是如何发包的 打开靶场:本地ip+ /sqli-labs-master/Less-12/ 先随便输入个账号登录如…

DevOps(七)Jenkins发布第一个流水线任务

Jenkins的流水线(Pipeline)是一种强大的工具,用于定义和管理持续集成和持续交付(CI/CD)过程。它允许你以代码的形式(即"Pipeline as Code")定义整个构建、测试和部署流程,…

第10章 物理安全要求

10.1 站点与设施设计的安全原则 假如没有对物理环境的控制,任何管理的、技术的或逻辑的访问控制技术都无法提供足够的安全性。 如果怀有恶意的人员获取了对设施及设备的物理访问权,那么他们几乎可以为所欲为,包括肆意破坏或窃取、更改数据。…

原来是这样的Three.js,我悟了

最近在b站上面看到up主:gamemcu的3D作品,着实让人感到非常震撼,作品中的SU7模型,利用的是Blender进行建模,利用了webGL的技术进行开发。由此启发了我对3D极大的乐趣。因此,凭借一点点🤏的前端知…

RK3588 Android13 TvSetting 中增加 Usb 模式 Host/OTG 切换

前言 电视产品,客户要求在设置中设备偏好设置子菜单下增加一个USB模式切换菜单,一开始准备直接开整。但发现在开发者选项里就已经包含了一个USB模式 菜单了,只是没有 OTG HOST 这两选项,那就把这个菜单挪出来再增加一下就完事了,开整。 客户提供对比机图 效果图 framew…

【计算机毕业设计】学习平台功能介绍——后附源码

🎉**欢迎来到我的技术世界!**🎉 📘 博主小档案: 一名来自世界500强的资深程序媛,毕业于国内知名985高校。 🔧 技术专长: 在深度学习任务中展现出卓越的能力,包括但不限于…

学习部分排序,插入排序,冒泡排序以及希尔排序

1.插入排序 <1>.首先我们举个例子 我们要把6进行前面的插入&#xff0c;那我们要进行比较&#xff0c;首先确定一个end的指针&#xff0c;然后他指向的数字就是我们需要比较的&#xff0c;如果end指向的数比我们end1 的大的话&#xff0c;那我们就往前挪一个&#xff0c…

有效Dk值提取方法的仿真分析

目录 1. TDR技术提取Dk值的方法 2. 传输线双端口Delta-L技术提取Dk值的方法 3. 传输线单端口Delta-L技术提取Dk值的方法 4. 总结 参考文献 1. TDR技术提取Dk值的方法 测试有效Dk值的一些传统而有效的方法[1][2]&#xff0c;是采用TDR阻抗测试仪测试专门设计的传输线的传播延…

我的AI数字人分身上线了!

说起AI数字人&#xff0c;大家一定不会陌生。随着全民AI时代的到来&#xff0c;许多机关单位、企业和个人&#xff0c;都纷纷制作了自己的数字人形象。 前些天&#xff0c;小灰的老东家刘强东也开始用数字人直播带货&#xff0c;瞬间引爆了全网。 这一切背后的本质是什么呢&…

抽真空规范操作

抽真空规范操作 抽真空操作中&#xff0c;一个被忽视的现象是&#xff1a;许多维修人员热衷于解决空调故障&#xff0c;却对施工过程中的规范操作敷衍了事。殊不知&#xff0c;正是这些看似微不足道的细节疏忽&#xff0c;往往诱发空调各类疑难故障&#xff0c;令售后维修陷入…

【创建型模式】原型模式

一、原型模式概述 原型&#xff08;Prototype&#xff09;模式的定义&#xff1a;用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里&#xff0c;原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效&#xf…

吴恩达深度学习笔记:深度学习的 实践层面 (Practical aspects of Deep Learning)1.4-1.5

目录 第一门课&#xff1a;第二门课 改善深层神经网络&#xff1a;超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第一周&#xff1a;深度学习的 实践层面 (Practical aspects of Deep Learning)…