外观模式详解

外观模式

1 概述

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

定义:

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

​ 外观(Facade)模式是“迪米特法则”的典型应用

请添加图片描述

2 结构

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

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

3 案例

【例】智能家电控制

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

请添加图片描述

代码如下:

//灯类
public class Light {public void on() {System.out.println("打开了灯....");}public void off() {System.out.println("关闭了灯....");}
}//电视类
public class TV {public void on() {System.out.println("打开了电视....");}public void off() {System.out.println("关闭了电视....");}
}//控制类
public class AirCondition {public void on() {System.out.println("打开了空调....");}public void off() {System.out.println("关闭了空调....");}
}//智能音箱
public class SmartAppliancesFacade {private Light light;private TV tv;private AirCondition airCondition;public SmartAppliancesFacade() {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() {System.out.println("起床了");light.on();tv.on();airCondition.on();}//睡觉一键关电器private void off() {System.out.println("睡觉了");light.off();tv.off();airCondition.off();}
}//测试类
public class Client {public static void main(String[] args) {//创建外观对象SmartAppliancesFacade facade = new SmartAppliancesFacade();//客户端直接与外观对象进行交互facade.say("打开家电");facade.say("关闭家电");}
}

好处:

  • 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。
  • 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。

缺点:

  • 不符合开闭原则,修改很麻烦

4 使用场景

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

5 源码解析

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

请添加图片描述

RequestFacade类就使用了外观模式。先看结构图:

请添加图片描述

为什么在此处使用外观模式呢?

​ 定义 RequestFacade 类,分别实现 ServletRequest ,同时定义私有成员变量 Request ,并且方法的实现调用 Request 的实现。然后,将 RequestFacade上转为 ServletRequest 传给 servletservice 方法,这样即使在servlet中被下转为 RequestFacade ,也不能访问私有成员变量对象中的方法。既用了 Request ,又能防止其中方法被不合理的访问。

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

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

相关文章

课时122:awk实践_进阶知识_赋值运算

1.2.1 赋值运算 学习目标 这一节,我们从 基础知识、简单实践、小结 三个方面来学习 基础知识 简介 awk本质上属于一种编程语言,所以它具有编程语言的一般功能,表达式、流程控制等基本上都在awk中具有想当程度的使用。这一节我们学习awk进…

【智能算法】最优捕食算法(OFA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2017年,GY Zhu受到动物行为生态学理论启发,提出了最优捕食算法(Optimal Foraging Algorithm, OFA)。 2.算法原理 2.1算法思想 OFA灵感来源…

【C++风云录】跨越语音壁垒:口语识别与方言分析

解码语音:语音识别新篇章 前言 本文将探讨C在口语识别与方言分析中的应用,简述其重要性和挑战,并详细介绍Kaldi, ProsodyLab-Aligner, PocketSphinx, HTK (HMM Toolkit), 和 OpenFst等语音识别和处理工具包和库的特点、主要功能以及实际应用…

常用的命令技巧总结

java命令执行 如下编码网站: Runtime.exec Payload Generater | AresXs Blogjava.lang.Runtime.exec() Payload Workarounds - Jackson_Thttps://www.bugku.net/runtime-exec-payloads/ 手动编码操作 bash -c {echo,cGluZyAxMjcuMC4wLjE7ZWNobyAxID50ZXN0LnR4dA}|…

Lab4: traps

RISC-V assembly Which registers contain arguments to functions? For example, which register holds 13 in mains call to printf? 根据RISC-V函数调用规范,函数的前8个参数使用a0-a7寄存器传递。 当main函数调用printf函数时,a2寄存器保存13 …

MVCC 详解

介绍 MVCC,全称 Multi-Version Concurrency Control,即多版本并发控制 MVCC的目的主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁。 这里的多版本指的是数据库中同时…

Springboot+Vue项目-基于Java+MySQL的毕业就业信息管理系统(附源码+演示视频+LW)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &…

网络工程师----第二十三天

1、关于有线传输介质: 1类线:主要用于电话传输 2类线:可用于电话传输和最高为4Mbps的数据传输,内部隐含有4对双绞线 3类线:多用于10Mbps以下的数据传输 4类线:可用于16Mpbs令牌环网和大型10Mbps以太网&…

跟我学C++中级篇——POD数据类型及演进

一、POD数据类型 首先说明,所谓POD类型不是常说的标准中的int,double这种数据类型。它是一种与C语言兼容的类型,能够直接以二进制形式与C库进行交互。这样说可能不好理解,意思就是说它可以直接使用memcpy,memmove等函数进行赋值。 POD&#…

java异常,日志,线程堆栈与Jvm调优

一.知识目录: 二.什么是java异常: 2.1 Throwable类中的重要方法: (1)四个构造方法(用来构造throwable对象,不同构造方法可以传递不同的参数值): /** 构造一个将 null 作为其详细消息的新 throwable */ Thr…

在STM32中用寄存器方式点亮流水灯

文章目录 实验资料一、对寄存器的理解1.通俗认识寄存器2.深入了解寄存器(1)端口配置低寄存器(配置0到7引脚的寄存器)(2)端口配置高寄存器(配置8到15引脚) 3.GPIO口的功能描述 二、配…

鸿蒙内核源码分析(Shell解析篇) | 应用窥视内核的窗口

系列篇从内核视角用一句话概括shell的底层实现为:两个任务,三个阶段。其本质是独立进程,因而划到进程管理模块。每次创建shell进程都会再创建两个任务。 客户端任务(ShellEntry): 负责接受来自终端(控制台)敲入的一个个字符&…

【云原生】 Kubernetes核心概念

目录 引言 一、部署方式回溯 (一)传统部署时代 (二)虚拟化部署时代 (三)容器部署时代 二、Kubernetes基本介绍 (一)为什么使用k8s (二)主要功能 &am…

以AI对抗AI,瑞数“动态安全+AI”助力在线反欺诈

勒索病毒、恶意软件、网络钓鱼攻击……科技头条每天都充斥着各种网络威胁的故事。同时,AI大模型等技术的加快发展,让网络威胁花样百出,有些明目张胆,有些则“锦衣夜行”,愈发难以识别和防范,为方兴未艾的数…

乡村振兴与数字乡村建设:加强农村信息化建设,推动数字乡村发展,提升乡村治理和服务水平,构建智慧化的美丽乡村

目录 一、引言 二、数字乡村建设的必要性 1、推动农村经济转型升级 2、提升乡村治理水平 3、改善乡村民生福祉 三、数字乡村建设的现状与挑战 1、现状 2、挑战 四、数字乡村建设的未来发展路径 1、加强农村信息化基础设施建设 2、提升农民信息素养和技能水平 3、制…

css 实现背景图和背景色正片叠底

.style {background-image: url(https://xxx.png);background-repeat: no-repeat;background-position: right center;background-color: rgb(3, 124, 207);border-bottom: 2px solid rgb(4, 83, 162);color: rgb(255, 255, 255);background-blend-mode: multiply; /*或者 col…

py黑帽子学习笔记_环境准备

1 下载os装os 下载一个kali虚机镜像然后用虚机管理软件创虚机,装完如下图,我用的版本是2024.1的版本kali-linux-2024.1-installer-amd64,可以从镜像站下载,官网下的慢还断网Index of /kali-images/kali-2024.1/ | 清华大学开源软…

OceanBase V4.2 特性解析:用Values Statement 语法进行SQL优化

1. 背景 你是否也遭遇过这样的场景:在输出多行多列表格数据时,却受限于只能依赖多 UNION ALL 语句来实现。在实际的工程应用中,我们也观察到有些用户程序生成的 SQL 语句中含有大量的 UNION ALL,这种结构的 SQL 对于 OceanBase 数…

C++高精度算法-加法

引子 在C++的运算中,难免会出现很大很大的数,下面是各个关键字的表示范围 但是如果要表示的数超过了long long可以表示的最大值( 2 64 2^{64} 264-1) 怎么办呢? 如果强制表示,就会溢出,这里的溢出大家可以自行百度,反正就是会出一些-5665434之类的数 现在,就要切入正…

网络基础-Telnet协议

Telnet(Telecommunication Network)是一种基于文本的远程终端协议,允许用户通过网络连接到远程计算机,并在远程计算机上执行命令;它使用TCP作为传输层协议,并依赖于网络连接在客户端和服务器之间进行通信&a…