【结构型模式】外观模式

news2024/11/16 12:04:16

​一、外观模式概述

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

  • 外观模式的特点:
    • 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.coloradmin.cn/o/1605804.html

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

相关文章

JRT在线初始化完善

之前实现的在线初始化留了个尾巴,那就是环境下载页构造zip包的时候没修改JRTBrowser的连接串地址为当前网站,这样就要求网站部署好之后给用户下载之前有人要把服务器的浏览器地址配置好。这样就增加一个运维工作,如果忘了或者不知道的人就会导…

在Windows安装R语言

直接安装R语言软件 下载网址:R: The R Project for Statistical Computing 下载点击install R for the first time 通过Anaconda下载RStudio 提前下载好Anaconda 点击Anaconda Navigate 点击RStudio的Install下载就好了

labelimg安装和使用(解决闪退问题)

🌈个人主页:Rookie Maker 🔥 系列专栏:计算机视觉 🏆🏆关注博主,随时获取更多关于IT的优质内容!🏆🏆 😀欢迎来到我的代码世界~ 😁 喜…

【行为型模式】命令模式

一、命令模式概述 命令模式的定义:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。(对象行为型) 命令模式优缺点: 优点: 1.类间解耦:调用者角色与接收者角色之间没有任何依…

复合升降机器人教学科研平台——技术方案

一:功能概述 1.1 功能简介 复合升降机器人是一款集成移动底盘、机械臂、末端执行器、边缘计算平台等机构形成的教学科研平台,可实现机器人建图导航、路径规划,机械臂运动学、动力学、轨迹规划、视觉识别等算法功能和应用,提供例如…

Kubernetes 容器网络技术架构及原理分析,赋能数字化转型

浅谈容器网络原理 我们将深入探讨容器和 Kubernetes 的网络原理,以全面了解 Kubernetes Network 的 Service。这些知识将帮助您轻松理解和使用 Service。 容器技术充分利用 Linux 的原生功能,如命名空间隔离、cgroup 限制和 rootfs,实现隔离和限制。同样地,容器网络也依赖…

改手机IP地址的软件推荐

随着移动互联网的普及,手机已成为人们日常生活中不可或缺的一部分。而在使用手机的过程中,IP地址作为一个重要的网络标识,有时也需要进行修改或更改。为了满足这一需求,市面上涌现出了许多改手机IP地址的软件。虎观代理将对这些软…

202462读书笔记|《一世珍藏的诗歌200首》——你曾经羞赧地向我问起, 是谁最早在此留下足印

202462读书笔记|《一世珍藏的诗歌200首》——你曾经羞赧地向我问起, 是谁最早在此留下足印 《一世珍藏的诗歌200首》作者金宏宇,很多美好的诗,有徐志摩,戴望舒,林徽因,舒婷等的诗精选,很值得一读…

ins视频批量下载,instagram批量爬取视频信息【爬虫实战课1】

简介 Instagram 是目前最热门的社交媒体平台之一,拥有大量优质的视频内容。但是要逐一下载这些视频往往非常耗时。在这篇文章中,我们将介绍如何使用 Python 编写一个脚本,来实现 Instagram 视频的批量下载和信息爬取。 我们使用selenium获取目标用户的 HTML 源代码,并将其保存…

【面试经典 150 | 二分查找】在排序数组中查找元素的第一个和最后一个位置

文章目录 写在前面Tag题目来源题目解读方法一:二分查找方法二:使用库函数 知识回顾二分查找的三种写法与三个问题常用的二分库函数 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……

实战1-批量爬取百度图片(上)

任务需求:输入关键字下载100个图片保存到本地,每个关键字单独存放一个文件夹(GUI版) 任务描述:当输入关键字时会爬取100个与关键词有关的图片到本地每个关键词单独保存到一个文件夹中,比如说我输入黑客下载…

【技术变现之道】如何打造IT行业的超级个体?

前言 在当今的数字化时代,IT行业蓬勃发展,为具备技术专长的个人提供了无限的可能性。想要成为IT行业的超级个体,实现知识与技能的变现吗?以下是一些高效途径,助你一臂之力! 1. 独立接单外包 1&#xff09…

C语言—常用字符串函数剖析

字符串函数 cplusplus.com/reference/cstring/ 更多没有总结到的函数大家可以自行查阅 这篇文章只是把最需要知道的函数做一个总结 strlen size_t strlen ( const char * str );字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的…

Android开发基础:Activity之间的跳转 向下一个Activity传递数据 给上一个Activity返回数据

目录 一,使用Intent在Activity之间跳转 1.显示使用Intent 2.隐式使用Intent 二,携带数据的跳转 1.Bundle 三,返回数据给上一个Activity 1.registerForActivityResult 一,使用Intent在Activity之间跳转 一个Android应用中包…

语言的未来:深度学习在自然语言处理中的革命

语言的未来:深度学习在自然语言处理中的革命 1 引言 自古以来,语言就是人类表达思想、传递信息、进行社会互动的基石。语言的复杂性既体现在其变化多端的语义、句法和语用层面,同时也反映在人类如何理解和产生自然语言的深奥之中。在这一节中…

java项目的构建工具-Maven

黑马程序员JavaWeb开发教程 文章目录 一、概述1、介绍(1)介绍(2)Maven的作用(3)官网(4)仓库 2、安装 二、IDEA 集成 Maven1、配置Maven环境2、创建Maven项目(1&#xff0…

java 红黑树

01.红黑树的定义: 每一个结点有五个属性:

Jmeter测试学习笔记

第一章 jmeter基础知识 一.Jmeter工具中的组件 1.测试计划:Jmeter测试的起点。容器。 2.线程组:代表一定的用户 3.取样器:发送请求的最小单元 4.逻辑控制器:处理请求逻辑 5.前置处理器:请求之前的操作 6.后置处…

docker部署的nginx配置ssl证书https

申请ssl证书,已腾讯的免费证书为例 2.上传证书到linux服务器 2.1 映射ssql目录 首先确保容器命令已映射宿主机目录,不一定是ssl,也可以是其他路径。 2.2 上传文件到指定路径 以我映射的ssl路径为例,我上传到宿主机的 /usr/local…

字母加密(C语言)

一、题目; 为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文。例如,可以按以下规律将电文变成密码:将字母A变成字母E,a变成e,即变成其后的第4个字母,W…