【结构型模式】外观模式

​一、外观模式概述

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

  • 外观模式的特点:
    • 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 {

	@Override
	public void turnOn() {
		// TODO 自动生成的方法存根
		System.out.println("打开警报器");
	}

	@Override
	public void turnOff() {
		// TODO 自动生成的方法存根
		System.out.println("关闭警报器");
	}

}
package facade.securitySystem;
//子系统录像机
public class Camera implements Equipment {

	@Override
	public void turnOn() {
		// TODO 自动生成的方法存根
		 System.out.println("打开录像机");
	}

	@Override
	public void turnOff() {
		// TODO 自动生成的方法存根
		System.out.println("关闭录像机");
	}

}
package facade.securitySystem;
//子系统灯
public class Light implements Equipment {

	@Override
	public void turnOn() {
		// TODO 自动生成的方法存根
		 System.out.println("打开电灯");
	}

	@Override
	public void turnOff() {
		// TODO 自动生成的方法存根
		System.out.println("关闭电灯");
	}

}
package facade.securitySystem;
//子系统传感器
public class Sensor implements Equipment {

	@Override
	public void turnOn() {
		// TODO 自动生成的方法存根
		System.out.println("打开传感器");
	}	

	@Override
	public 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.mfbz.cn/a/559697.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电磁炉原理笔记

电磁炉加热原理 【电磁炉工作原理,电涡流感应加热原理】 https://www.bilibili.com/video/BV11M411M7Wt/?share_sourcecopy_web&vd_source44c5c5fe44538189ece80f09460cf625 我是看的这个科普视频; 总结一下就是下图: 线圈的磁场影响…

链表判环问题

1、为什么slow走一步,fast走两步,会不会错过?请证明。 假设slow进环的时候fast和slow之间的距离时N,slow进环以后,fast开始追击slow每走一步,fast走2步,他们之间的距离缩小1. fast和slow之间的…

“三步走”带你拿下C++类与对象(下)

在学习了“上”篇和“中”篇后,我们对类和对象以及一些析构函数有了一定的理解,本文我们将继续深入讲解有关的其他内容。 一、初始化列表的引入 我们以之前的队列为例子(创建两个队列一个用于入栈一个用于出栈) 这个myqueue对内…

全志R329 AP6256 蓝牙调试

1、在全志r329平台移植AP6256,移植了一个星期,记录下过程。 2、本来产品只需要wifi,不需要蓝牙的。但是我们使用的是正基AP6256的wifi、BT二合一的模组。 该模块只要有BT功能就需要做BT的3C认证。 好吧。 1、获取调试蓝牙的几个工具 两个方法: 1.1、方法一:自己交叉…

蓝桥杯2024年第十五届省赛真题-爬山

贪心优先队列的题&#xff0c;贪心会漏一个情况&#xff0c;不知道怎么处理&#xff0c;这里直接打表了 2 1 1 48 49 答案是30&#xff0c;贪心是31 专有名词&#xff1a;hack-有新的测试点过不了 #include<bits/stdc.h> using namespace std; #define endl \n #define …

QT C++ sqlite 对多个数据库的操作

//本文描述&#xff0c;QT 对多数据库的操作。 //你可能会想&#xff0c;多数据库的操作时&#xff0c;查询语句怎么知道是哪个数据库。 //QT提供了这样一种构造函数 QSqlQuery(const QSqlDatabase &db) //指定数据库 //在QT6.2.4 MSVC2019调试通过。 //效果见下图&am…

HarmonyOs开发:导航tabs组件封装与使用

前言 主页的底部导航以及页面顶部的切换导航&#xff0c;无论哪个系统&#xff0c;哪个App&#xff0c;都是最常见的功能之一&#xff0c;虽然说在鸿蒙中有现成的组件tabs可以很快速的实现&#xff0c;但是在使用的时候&#xff0c;依然有几个潜在的问题存在&#xff0c;第一&a…

12. MyBatis(二)

源码位置&#xff1a;MyBatis_demo 上篇文章我们学习了MyBatis的定义以及增删查改操作&#xff0c;并且学习了如何在xml文件中编写SQL时使用#{}的方式将参数和对象的属性映射到SQL语句中&#xff0c;上篇的内容已经足以应对大部分场景&#xff0c;本篇文章我们就要学习一下MyBa…

测绘管理与法律法规 | 测绘资质管理办法 | 学习笔记

目录 一、测绘资质概述 二、测绘资质分类与等级 三、审批与管理 四、申请条件 五、审批程序 六、测绘资质证书 七、监督管理 八、违规处理 九、特殊规定 十、审批受理时间要点补充 1. 审批机关决定是否受理的时间 2. 审批机关作出批准与否的决定时间 3. 颁发测绘资…

linux /proc进程文件目录介绍

参考&#xff1a;https://zhuanlan.zhihu.com/p/619966043 有时候想只查出来进程号&#xff0c;可以通过/proc/下查出该进程的运行及执行脚本情况信息 /proc/pid子目录 记录了进程的相关信息cmdline文件&#xff1a;包含了进程启动时使用的完整命令行参数。 cwd符号链接&#x…

29. 【Android教程】折叠列表 ExpandableListView

本节学习一个可折叠的 ListView&#xff0c;可以用在一些需要分类的场景下。通过 ExpandableListView 我们可以首先在 ListView 上展示大的分类&#xff0c;当点击某个类别的时候再将 ListView 做一个展开&#xff0c;展示该类下的所有子类供用户选择。它与 ListView 的不同主要…

考研数学|武忠祥VS张宇,谁讲得更全面❓

张宇和武忠祥都是很好的老师&#xff0c;你肯定也是这么觉得的&#xff0c;你自己也说了&#xff0c;跟着张宇看了几章&#xff0c;感觉不错&#xff0c;那就继续跟着啊&#xff0c;为什么听到同学说武忠祥好&#xff0c;你就动摇了呢。我们对于任何事情都要有自己的思考和规划…

SQL注入简单总结

一、SQL注入是什么 SQL注入即&#xff1a;是指web应用程序对用户输入数据的合法性没有判断或过滤不严&#xff0c;攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句&#xff0c;在管理员不知情的情况下实现非法操作&#xff0c;以此来实现欺骗数据库服…

prompt问题【中间不好】

问题1:longchain 关键词在中间容易被忽略掉 Found in the Middle: How Language Models Use Long Contexts Better via Plug-and-Play Positional Encoding 论文对大模型在长文本情况下的性能做了一系列实验研究&#xff0c;发现了一个有趣的“Lost in the middle”现象&#x…

我与C++的爱恋:隐式类型转换

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 朋友们大家好&#xff0c;本篇内容我们来介绍初始化列表&#xff0c;隐式类型转换以及explicit的内容 一、初始化列表 1.1 构造函数体赋值 在创建对象时&#xff0c;编译器…

【笔试强训】Day3 --- 简写单词 + dd爱框框 + 除2!

文章目录 1. 简写单词2. dd爱框框3. 除2&#xff01; 1. 简写单词 【链接】&#xff1a;简写单词 解题思路&#xff1a;简单模拟题&#xff0c;主要是处理⼀下输⼊的问题。&#xff08;也可以利用string类中的find函数&#xff0c;但时间复杂度会偏高&#xff09; #include …

一套全院级PACS系统源码,实现影像检查的电子预约申请、电子诊断报告、 临床科室设立影像浏览终端等功能

一套全院级PACS系统源码&#xff0c;实现影像检查的电子预约申请、电子诊断报告、 临床科室设立影像浏览终端等功能 一套全院级PACS系统源码&#xff0c;包括放射、CT、超声、内镜、病理等科室影像及信息管理系统的建设&#xff0c;解决医学影像的采集、诊断、传输、存储&#…

电感与磁珠

电感是什么&#xff1f; 电感会通过产生感应电动势的方式来阻碍电流的变化&#xff0c;电流变化率越大&#xff0c;产生的感应电动势越大阻碍电流效果越明显。 [一]品质因数Q: 电感的品质因数Q值定义&#xff1a;电感的Q值也叫作品质因数&#xff0c;其为无功功率除以有功功率…

永恒之蓝复现

目录 一、原理 二、实验环境 三、实验步骤 \1. 查询ip \2. 测试两台主机的连通性 \3. 查询指kali数据库的状态 \4. 此时就可以进行永恒之蓝漏洞扫描&#xff0c;&#xff08;永恒之蓝利用的是ms17_010漏洞&#xff0c;因此到这一步之后的任务就是在kali 里寻找ms17_010漏…

比特币减半倒计时:NFT 生态将受到怎样的影响?

BTC 减半倒计时仅剩不到 1 天&#xff0c;预计在 4 月 20 日迎来减半。当前区块奖励为 6.25 BTC&#xff0c;减半后区块奖励为 3.125 BTC&#xff0c;剩余区块为 253。比特币减半无疑是比特币发展史上最重要的事件之一&#xff0c;每当这一事件临近&#xff0c;整个加密社区都充…
最新文章