【设计模式】外观模式

文章目录

  • 前言
  • 一、外观模式
    • 1.案例
    • 2.优缺点
    • 3.使用场景
    • 4.源码解析
  • 总结


前言

【设计模式】外观模式


一、外观模式

有些人可能炒过股票,但其实大部分人都不太懂,这种没有足够了解证券知识的情况下做股票是很容易亏钱的,刚开始炒股肯定都会想,如果有个懂行的帮帮手就好,其实基金就是个好帮手,支付宝里就有许多的基金,它将投资者分散的资金集中起来,交由专业的经理人进行管理,投资于股票、债券、外汇等领域,而基金投资的收益归持有者所有,管理机构收取一定比例的托管管理费用。
定义:

  • 又名门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。
  • 外观(Facade)模式是“迪米特法则”的典型应用

在这里插入图片描述

外观(Facade)模式包含以下主要角色:

  • 外观(Facade)角色:为多个子系统对外提供一个共同的接口。
  • 子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它。

1.案例

【例】智能家电控制

小明的爷爷已经60岁了,一个人在家生活:每次都需要打开灯、打开电视、打开空调;睡觉时关闭灯、关闭电视、关闭空调;操作起来都比较麻烦。所以小明给爷爷买了智能音箱,可以通过语音直接控制这些智能家电的开启和关闭。

类图如下:

在这里插入图片描述

/*** @Version: 1.0.0* @Author: Dragon_王* @ClassName: AirCondition* @Description: 空调类* @Date: 2023/12/24 16:55*/
public class AirCondition {public void on() {System.out.println("打开空调。。。");}public void  off() {System.out.println("关闭空调。。。");}
}=============================
/*** @Version: 1.0.0* @Author: Dragon_王* @ClassName: Light* @Description: 电灯类* @Date: 2023/12/24 16:52*/
public class Light {public void on() {System.out.println("打开电灯。。。");}public void off() {System.out.println("关闭电灯。。。");}
}==========================
/*** @Version: 1.0.0* @Author: Dragon_王* @ClassName: TV* @Description: 电视机类* @Date: 2023/12/24 16:53*/
public class TV {public void on() {System.out.println("打开电视机及。。。");}public void off() {System.out.println("关闭电视机。。。");}
}
==========================
/*** @Version: 1.0.0* @Author: Dragon_王* @ClassName: SmartApplicancesFacade* @Description: TODO描述* @Date: 2023/12/24 16:56*/
public class SmartApplicancesFacade {private Light light;private TV tv;private AirCondition airCondition;public SmartApplicancesFacade() {light = new Light();tv = new TV();airCondition = new AirCondition();}public void say(String message) {if (message.contains("打开")) {on();}else if (message.contains("关闭")){off();}else {System.out.println("我还听不懂你说的话");}}private void on() {light.on();tv.on();airCondition.on();}private void off() {light.off();tv.off();airCondition.off();}
}
========================
/*** @Version: 1.0.0* @Author: Dragon_王* @ClassName: Client* @Description: TODO描述* @Date: 2023/12/24 16:59*/
public class Client {public static void main(String[] args) {SmartApplicancesFacade smartApplicancesFacade =new SmartApplicancesFacade();smartApplicancesFacade.say("打开家电");System.out.println("=======================");smartApplicancesFacade.say("关闭家电");}
}

在这里插入图片描述

2.优缺点

  • 好处:
    • 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。
    • 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。
  • 缺点:
    • 不符合开闭原则,修改很麻烦

3.使用场景

  • 对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系。
  • 当一个复杂系统的子系统很多时,外观模式可以为系统设计一个简单的接口供外界访问。
  • 当客户端与多个子系统之间存在很大的联系时,引入外观模式可将它们分离,从而提高子系统的独立性和可移植性。

4.源码解析

使用tomcat作为web容器时,接收浏览器发送过来的请求,tomcat会将请求信息封装成ServletRequest对象,如下图①处对象。但是大家想想ServletRequest是一个接口,它还有一个子接口HttpServletRequest,而我们知道该request对象肯定是一个HttpServletRequest对象的子实现类对象,到底是哪个类的对象呢?可以通过输出request对象,我们就会发现是一个名为RequestFacade的类的对象。

在这里插入图片描述
RequestFacade类就使用了外观模式。先看结构图:
在这里插入图片描述
为什么在此处使用外观模式呢?
定义 RequestFacade 类,分别实现 ServletRequest ,同时定义私有成员变量 Request ,并且方法的实现调用 Request 的实现。然后,将 RequestFacade上转为 ServletRequest 传给 servlet 的 service 方法,这样即使在 servlet 中被下转为 RequestFacade ,也不能访问私有成员变量对象中的方法。既用了 Request ,又能防止其中方法被不合理的访问。


总结

以上就是外观模式的讲解。

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

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

相关文章

Can‘t locate IPC/Cmd.pm in @INC (@INC contains:解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

JAVA进化史:JDK6特性及说明

JDK 6(Java Development Kit 6)是Java平台的一个重要版本,它于2006年12月发布。在这个版本中,引入了许多新特性和改进,使得Java编程更加强大和灵活。以下是一些JDK 6的特性,并包含了一些示例说明&#xff1…

适应变化:动态预测在机器学习中的作用

一、介绍 机器学习 (ML) 中的动态预测是指随着新数据的出现而不断更新预测的方法。这种方法在从医疗保健到金融等各个领域越来越重要,其中实时数据分析和最新预测可以带来更好的决策和结果。在本文中,我将讨论机器学习中动态预测的概念、其优势、挑战以及…

网络瑞士军刀应用Cyber​​Chef

本文软件由网友 zxc 推荐; 什么是 Cyber​​Chef ? Cyber​​Chef 是一款简单、直观的网络应用程序,用于在网络浏览器中执行各种“网络”操作。这些操作包括 XOR 和 Base64 等简单编码、AES、DES 和 Blowfish 等更复杂的加密、创建二进制和十六进制转储…

蓝桥杯python比赛历届真题99道经典练习题 (13-20)

【程序13】 题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数 本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。 1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。 2.程序…

SVN管理-备份还原篇

背景: 当你没有svn的时候,写代码战战兢兢,又怕代码丢失白干,搞了svn做版本管理,随着时间的推移,所有的版本信息都在唯一的svn服务器,又开始担心服务器宕机,数据丢失问题&#xff0c…

【HarmonyOS】鸿蒙开发简介与项目基础配置演示

从今天开始,博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”,对于刚接触这项技术的小伙伴在学习鸿蒙开发之前,有必要先了解一下鸿蒙,从你的角度来讲,你认为什么是鸿蒙呢?它出现的意义又是…

达梦数据库文档

1:达梦数据库(DM8)简介 达梦数据库管理系统是武汉达梦公司推出的具有完全自主知识产权的高性能数据库管理系统,简称DM。达梦数据库管理系统目前最新的版本是8.0版本,简称DM8。 DM8是达梦公司在总结DM系列产品研发与应用经验的基础上&#xf…

IPD-PDP产品开发流程-PDT产品开发计划Charter文档模板(word)3

今天继续为家分享PDT的产品开发计划Charter模板的内容。 Charter任务书模板内容7:人力资源和技能需求 在这一部分,列出项目在不同阶段所需要的不同人力资源需求、数量、能力要求,以及对于一些特殊人力资源的需求。 7.1不同阶段的人力资源汇…

概率论基础复习题

一、填空题 二、选择题 答案:B 答案:C 答案:C 答案:D。统计量不含任何未知参数。 答案:A 答案:C 样本均值是总体均值的无偏估计;样本方差是总体方差的无偏估计。 答案:B。统计值是一…

4.25 构建onnx结构模型-Split

前言 构建onnx方式通常有两种: 1、通过代码转换成onnx结构,比如pytorch —> onnx 2、通过onnx 自定义结点,图,生成onnx结构 本文主要是简单学习和使用两种不同onnx结构, 下面以 Slice 结点进行分析 方式 方法一…

Spring + SpringMVC + SpringBoot

Spring: 优点: Spring是一个开源的免费框架(容器)!Spring是一个轻量级的,非入侵的框架!控制反转(IOC),面向切面编程(AOP)支持事务的…

改进模型性能入手点

改进模型性能: 增加数据量: 更多的数据通常可以提高模型的泛化能力。尽量收集更多的训练数据,或者考虑使用数据增强技术来扩充现有数据集。调整模型架构: 考虑修改模型的架构,增加或减少层的数量,调整每层…

Linux学习网站

学习 Linux 的资源非常丰富,包括官方文档、在线教程、交互式学习平台和视频课程。以下是一些推荐的网站和资源,适合不同层次的 Linux 用户,从初学者到高级用户: 在线教程和课程 Linux Foundation Training: 网址: training.linu…

elasticsearch+Kibana

什么是es(elasticsearch) Elasticsearch是一个开源的分布式搜索和分析引擎,它构建在Apache Lucene搜索引擎库之上。它提供了一个分布式多用户能力的实时搜索和分析引擎,能够处理大规模的数据。Elasticsearch被广泛用于构建全文搜索、日志分析、实时应用…

油猴脚本开发,之如何添加html和css

简介 油猴是一个脚本管理器,让我们能够方便的使用js脚本,以实现对页面内容的修改、功能增强或其他定制化操作。 常见脚本管理器 Tampermonkey 应该是各位见得最多的也是最知名的,好用又稳定,多浏览器支持Greasemonkey 用户脚本始祖&#x…

4.24 构建onnx结构模型-Slice

前言 构建onnx方式通常有两种: 1、通过代码转换成onnx结构,比如pytorch —> onnx 2、通过onnx 自定义结点,图,生成onnx结构 本文主要是简单学习和使用两种不同onnx结构, 下面以 Slice 结点进行分析 方式 方法一:pytorch --> onnx 暂缓,主要研究方式二 方法…

omlox定位标准(二)——定位核心

上一篇文章中介绍了关于omlox hub相关内容,可以用于整合多种API接口,便于实现统一的应用,本文中介绍omlox core,介绍了基础设施、定位技术、定位引擎等内容。 2.omlox core zone and air-interface 随着越来越多的业务应用基于室…

鸿蒙4.0实战教学—基础ArkTS(简易视频播放器)

构建主界面 主界面由视频轮播模块和多个视频列表模块组成,效果图如图: VideoData.ets中定义的视频轮播图数组SWIPER_VIDEOS和视频列表图片数组HORIZONTAL_VIDEOS。 // VideoData.ets import { HorizontalVideoItem } from ./HorizontalVideoItem; impo…

优化v-viewer加载性能

v-viewer简介 v-viewer 是一个 Vue 组件&#xff0c;用于显示图片和其他媒体内容的全屏查看器。它基于 Viewer.js&#xff0c;一个强大的图片查看库。 以下是一个基本的使用示例&#xff1a; <template><div v-viewer><img src"image1.jpg" />&…