Java 设计模式——外观模式

目录

  • 1.概述
  • 2.结构
  • 3.实现
    • 3.1.子系统类
    • 3.2.外观类
    • 3.3.测试
  • 4.优缺点
  • 5.使用场景
  • 6.源码解析

1.概述

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

(2)外观模式 (Facade Pattern) 是一种结构型设计模式,又称为门面模式,它提供了一个统一的接口,用于简化复杂系统或子系统的接口,并将其封装成一个更高级别的接口。外观模式隐藏了系统的复杂性,通过定义一个高层接口,使得客户端与系统的交互更加简单和方便。此外,外观模式是迪米特法则的典型应用。

在这里插入图片描述

2.结构

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

  • 外观 (Facade) 角色:外观对象是客户端与子系统之间的中间层,它封装了一组相关的子系统接口,对客户端提供一个更简单、更高层次的接口。
  • 子系统 (Subsystem) 角色:子系统是完成真正业务逻辑的组件,它包含了一系列相互关联的类和方法。每个子系统都有自己的功能和职责,但客户端可能不需要直接与子系统进行交互。

3.实现

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

3.1.子系统类

Light.java

public class Light {public void on(){System.out.println("打开电灯......");}public void off(){System.out.println("关闭电灯......");}
}

TV.java

public class TV {public void on(){System.out.println("打开电视机......");}public void off(){System.out.println("关闭电视机......");}
}

AirCondition.java

public class AirCondition {public void on(){System.out.println("打开空调......");}public void off(){System.out.println("关闭空调......");}
}

3.2.外观类

SmartAppliancesFacade.java

//外观类,用户主要和该类对象进行交互
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("我还听不懂你说的!!!");}}//一件打开功能public void on() {light.on();tv.on();airCondition.on();}//一件关闭功能public void off() {light.off();;tv.off();airCondition.off();}
}

3.3.测试

Client.java

public class Client {public static void main(String[] args) {//创建智能音箱对象SmartAppliancesFacade facade = new SmartAppliancesFacade();//控制家电facade.on();System.out.println("==========");//关闭家电facade.off();}
}

输出结果如下:

打开电灯......
打开电视机......
打开空调......
==========
关闭电灯......
关闭电视机......
关闭空调......

4.优缺点

(1)外观模式有以下几个优点:

  • 简化客户端的调用:通过外观对象提供的简单接口,客户端可以更方便地与系统进行交互,不需要了解系统的复杂性和内部结构。
  • 将客户端与子系统解耦:外观模式将子系统封装起来,客户端只需要与外观对象进行交互,而不需要与各个子系统直接交互,降低了客户端与子系统之间的耦合度。
  • 提高代码的可维护性:通过将复杂的系统逻辑封装在外观对象中,提升了代码的可读性和可维护性。修改系统时,只需调整外观对象的接口,而不需要修改客户端代码。
  • 提供统一的接口:外观对象为系统的各个子系统定义了一个统一的接口,使得系统更易于理解和使用。

(2)外观模式也有一些缺点:

  • 过度增加了一个新的抽象层:外观模式引入了一个新的外观对象,可能会导致系统中类的数量增加,从而增加了系统的复杂性。
  • 不符合开闭原则:当系统的功能发生变化时,可能需要修改外观对象的接口,这可能会影响到客户端代码。
  • 不能完全隐藏子系统的复杂性:外观模式可以隐藏一部分子系统的复杂性,但如果客户端需要直接访问子系统的一些细节,就无法避免与子系统发生直接交互。

5.使用场景

(1)外观模式适用于以下情况:

  • 当需要简化复杂系统或子系统的接口时,可以使用外观模式。例如,一个系统包含多个子系统,每个子系统有自己的接口,但客户端可能不需要直接调用所有子系统的接口,此时可以使用外观模式将这些子系统接口封装成一个更高层级的接口。
  • 当需要将系统与客户端分离并提高系统可维护性时,可以使用外观模式。通过将系统的复杂性封装到外观对象中,可以减少客户端代码与子系统之间的耦合,并提高代码的可读性和可维护性。
  • 当需要对现有系统进行重构时,可以使用外观模式。通过增加外观对象,可以将系统的接口分层并提高代码的结构性,从而使系统更加易维护。

(2)总之,外观模式适用于需要简化系统接口、分离客户端与子系统之间的耦合度、提高代码可维护性以及改善系统的可用性和可理解性的情况。它是一个常用的结构型设计模式,在实际开发中有着广泛的应用。

6.源码解析

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

在这里插入图片描述
(2)RequestFacade 类就使用了外观模式。其结构图如下所示:
在这里插入图片描述

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

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

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

相关文章

网工内推 | 售后工程师,IP认证优先,最高15薪,年底有分红

01 威发系统(中国)有限公司 招聘岗位:售后工程师 职责描述: 1、负责各种规模的项目售后安装、调试和维护工作; 2、解决工程和维护中的一般技术问题,支持、协助处理其他相关的技术问题; 3、与…

使用Android Jetpack Compose渲染效果打造酷炫的动画效果

如何在Android Jetpack Compose中使用渲染效果打造令人惊艳的视觉体验 学习示例:如何使用渲染效果来改变UI界面 引言 Jetpack Compose提供了各种工具和组件来构建引人入胜的UI,而在Compose中较为鲜为人知的一个宝藏是RenderEffect。 在这篇博文中&a…

Linux文件系统的功能规划

对于运行的进程来说,内存就像一个纸箱子,仅仅是一个暂存数据的地方,而且空间有限。如果我们想要进程结束之后,数据依然能够保存下来,就不能只保存在内存里,而是应该保存在外部存储中。就像图书馆这种地方&a…

操作系统引论(二)

操作系统发展动力及技术基础 推动操作系统的发展和资源利用率的提高是相关联的。 让输入输出相对独立,通道技术,通道相当于简单的处理器,通过输入输出指令,控制外设完成输入输出。 输入和输出过程不是由主机控制的,是…

flink的AggregateFunction,merge方法作用范围

背景 AggregateFunction接口是我们经常用的窗口聚合函数,其中有一个merge方法,我们一般情况下也是实现了的,但是你知道吗,其实这个方法只有在你使用会话窗口需要进行窗口合并的时候才需要实现 AggregateFunction.merge方法调用时…

大数据技术之集群数据迁移

文章目录 数据治理之集群迁移数据 数据治理之集群迁移数据 准备两套集群,我这使用apache集群和CDH集群。 启动集群 启动完毕后,将apache集群中,hive库里dwd,dws,ads三个库的数据迁移到CDH集群 在apache集群里hosts加上CDH Namenode对应域名并…

bff层解决了什么痛点

bff层 -- 服务于前端的后端 什么是bff? Backend For Frontend(服务于前端的后端),也就是服务器设计API的时候会考虑前端的使用,并在服务端直接进行业务逻辑的处理,又称为用户体验适配器。BFF只是一种逻辑…

【hcie-cloud】【2】华为云Stack解决方案介绍、缩略语整理 【下】

文章目录 华为文档获取方式、云计算发展背景、坚实基座华为云Stack,政企只能升级首选智能数据湖仓一体,让业务洞见更准,价值兑现更快MRS:一个架构可构建三种数据湖,业务场景更丰富离线数据湖:提供云原生、湖…

服务器感染了.locked勒索病毒,如何确保数据文件完整恢复?

引言: 网络安全威胁的不断演变使得恶意软件如.locked勒索病毒成为当今数字时代的一大挑战。.locked勒索病毒能够加密您的文件,然后要求支付赎金以解锁它们。本文将深入探讨.locked勒索病毒的特点,以及如何应对感染,以及预防这种类…

3款免费又好用的 Docker 可视化管理工具

前言 Docker提供了命令行工具(Docker CLI)来管理Docker容器、镜像、网络和数据卷等Docker组件。我们也可以使用可视化管理工具来更方便地查看和管理Docker容器、镜像、网络和数据卷等Docker组件。今天我们来介绍3款免费且好用的 Docker 可视化管理工具。…

网络安全深入学习第八课——反向代理(工具:frp)

文章目录 一、实验环境二、实验要求三、开始模拟1、攻击机配置frp文件2、攻击拿下跳板机,并且上传frpc.ini、frpc.exe、frpc_full.ini文件3、把frps.ini、、frps.exe、frps_full.ini文件放到VPS主机上4、VPS机开启frp5、跳板机开启frp6、验证 一、实验环境 攻击机&…

云尘 命令执行系列

第一题 system <?php include "flag.php";if (isset($_POST[cmd])) {system($_POST[cmd]); }show_source(__FILE__);代码如上 system($_POST[cmd]); POST请求发送一个名为 cmd 的参数&#xff0c;然后将该参数的值传递给系统命令执行函数 system()&#xff0c…

NVIDIA大模型平台软件全家桶开启云智能第二曲线

第二曲线由英国管理思想大师查尔斯汉迪提出&#xff0c;讲的是在企业第一曲线达到巅峰的时候&#xff0c;找到驱动企业二次腾飞的第二曲线。而如果企业想实现基业长青&#xff0c;就需要通过主动式破局式创新&#xff0c;跨越到第二曲线中。对于当下的云智能产业以及基于云智能…

【电源专题】PSE如何与PD握手协商功率等级?

在文章:【电源专题】POE连接方式与功率等级划分 中我们讲到POE协议对不同的PD设备进行划分,比如根据不同的供电标准又可以细分成好几种不同的类型(Type1~Type4)和功率等级。 那么有这么多功率等级,PSE怎么知道PD是哪种类型呢?怎么能进行握手协商呢? 下图为PSE与PD设备在…

python 之生成器表达式,以及与列表推导式的区别

文章目录 生成器表达式基本结构示例生成一个简单的生成器遍历生成器并获取值使用条件过滤 优点 生成器表达式与列表推导式的区别1. 返回类型2. 生成方式3. 内存占用4. 访问方式示例总结 生成器表达式是一种在 Python 中用来创建生成器的高效方法。生成器表达式和列表推导式类似…

jstat虚拟机统计信息监控工具

jstat虚拟机统计信息监控工具 1、jstat&#xff08;JVM Statistics Monitorning Tool&#xff09; 用于监控虚拟机各种运行状态信息的命令行工具。 它可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据&#xff0c;它是运行期定位虚拟机 性能问题…

数据结构——基于顺序表实现通讯录

一、. 基于动态顺序表实现通讯录 1.1 功能要求 1&#xff09;⾄少能够存储100个⼈的通讯信息 2&#xff09;能够保存⽤⼾信息&#xff1a;名字、性别、年龄、电话、地址等 3&#xff09;增加联系⼈信息 4&#xff09;删除指定联系⼈ 5&#xff09;查找制定联系⼈ 6&…

vuepress 打包后左侧菜单链接 404 问题解决办法

背景 上周看到一本开源书 《深入架构原理与实践》&#xff0c;是基于 vuepress 搭建的&#xff0c;下载了源码&#xff0c;本地部署了一下&#xff0c;本文记录如何打包该源码遇到的路径问题及思考。 结论&#xff1a; vuepress 插件的 sideBar 的菜单路径默认是相对 / 的&am…

FPGA高端项目:图像缩放+GTP+UDP架构,高速接口以太网视频传输,提供2套工程源码加QT上位机源码和技术支持

目录 1、前言免责声明本项目特点 2、相关方案推荐我这里已有的 GT 高速接口解决方案我这里已有的以太网方案我这里已有的图像处理方案 3、设计思路框架设计框图视频源选择ADV7611 解码芯片配置及采集动态彩条跨时钟FIFO图像缩放模块详解设计框图代码框图2种插值算法的整合与选择…

【Java 进阶篇】MVC 模式

欢迎来到本篇详细解释 MVC&#xff08;Model-View-Controller&#xff09;设计模式的教程。MVC 是一种用于组织应用程序的设计模式&#xff0c;有助于将应用程序分成不同的部分&#xff0c;以提高代码的可维护性和可扩展性。在本文中&#xff0c;我们将深入研究 MVC 模式&#…