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.rhkb.cn/news/185035.html

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

相关文章

CSS 滚动捕获 Scroll Snap

CSS 滚动捕获 Scroll Snap CSS 滚动捕获允许开发者通过声明一些位置(或叫作捕获位置)来创建精准控制的滚动体验. 通常来说轮播图就是这种体验的例子, 在轮播图中, 用户只能停在图 A 或者图 B, 而不能停在 A 和 B 的中间. 比如平时用淘宝或小红书, 当你上滑到下一个推荐内容时…

MySQL json相关函数详解

MySQL提供了一系列的JSON函数,用于解析、提取、修改和操作JSON数据。以下是一些常用的JSON函数及其功能。 以下所有操作都使用该表(zone_test)用来演示: 一:JSON_OBJECT(key1,value1,key2,value2) 1、作用:…

json数据格式的理解(前+后)

什么是JSON: JSON(JavaScript Object Notation)是一种广泛使用的数据交换格式,它在前端和后端开发中都扮演着重要的角色。 JSON 的结构: JSON 数据由大括号 {} 包围,表示对象。 对象中的数据以键值对形式…

【C/PTA】循环结构进阶练习(三)

本文结合PTA专项练习带领读者掌握循环结构,刷题为主注释为辅,在代码中理解思路,其它不做过多叙述。 文章目录 7-1 循环-Fibonacci数列的运算7-2 循环-找数字7-3 循环-小智的捕食计划7-4 循环-抱大腿7-5 循环-跳!7-6 循环-生气的峰…

Docker学习——⑤

文章目录 1、什么是Docker Container(容器)2、容器的生命周期2.1 容器 OOM2.2 容器异常退出2.3 容器暂停 3、容器命令详解4、容器操作案例4.1 容器批量处理技巧4.2 容器交互模式4.3 容器自动重启4.4 容器环境变量配置 5、综合实战5.1 Mysql 容器化安装5.…

〔003〕虚幻 UE5 基础教程和蓝图入门

✨ 目录 ▷ 新建项目▷ 快捷操作▷ 镜头移动速度▷ 新建蓝图关卡▷ 打印字符串▷ 蓝图的快捷键▷ 场景中放置物体▷ 通过蓝图改变物体位置▷ 展现物体运动轨迹▷ 队列运行▷ 新建项目 打开虚幻启动程序,选择 引擎版本 后点击 启动选择 游戏 类型,默认设置中选择 蓝图,项目名…

C# winform 定时器

1.加入Timer using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace Te…

基于Fuzzing和ChatGPT结合的AI自动化测试实践分享

一、前言 有赞目前,结合insight接口自动化平台、horizons用例管理平台、引流回放平台、页面比对工具、数据工厂等,在研发全流程中,已经沉淀了对应的质量保障的实践经验,并在逐渐的进化中。 在AI能力大幅进步的背景下&#xff0c…

挑战100天 AI In LeetCode Day03(热题+面试经典150题)

挑战100天 AI In LeetCode Day03(热题面试经典150题) 一、LeetCode介绍二、LeetCode 热题 HOT 100-52.1 题目2.2 题解 三、面试经典 150 题-53.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站,提供各种算法和数据结构的题目&am…

MySQL基础操作

注:mysql是大小写不敏感的. 1.数据库基础操作(展示) //1.展示当前数据库 show databases;//2.创建数据库 create database 数据库名;//3.使用数据库 use 数据库名;//4.删除数据库 drop database 数据库名;2.SQL中基本类型 2.1 数值类型(整数和浮点型) 注:decimal和numeric…

在Kotlin中设置User-Agent以模拟搜索引擎爬虫

前言 随着双十一电商活动的临近,电商平台成为了狂欢的中心。对于商家和消费者来说,了解市场趋势和竞争对手的信息至关重要。在这个数字时代,爬虫技术成为了获取电商数据的有力工具之一。本文将以亚马逊为例,介绍如何使用Kotlin编…

第22章_数据库的设计规范

文章目录 范式的概念三范式范式一范式二范式三 反范式总结 范式的概念 为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库&#xff…

系列一、Spring + SpringMVC + MyBatis整合

一、概述 整合 Spring、SpringMVC、MyBatis。 二、整合步骤 2.1、pom <dependencies><!-- 普通maven项目中使用Sl4j注解 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1…

【JVM】运行时数据区、程序计数器

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 JVM 一、 运行时数据区二、 程序计数器程序…

关于 pthread_create 传参的疑问

对于函数原型 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg) 里的参数 arg&#xff0c;之前一直有疑问&#xff0c;就是把 &thread 传给 arg时&#xff0c;新创建的线程里是否能取到这个值呢&#xff1…

macOS电池续航工具:Endurance中文

Endurance for Mac是一款强大而实用的电池管理和优化软件&#xff0c;专为MacBook设计。通过智能调整系统设置和管理后台应用&#xff0c;它能有效延长电池续航时间&#xff0c;提升工作和娱乐效率&#xff0c;成为你在各种场合下的得力助手。 Endurance for Mac软件的功能特色…

国网计算机类2024年最新考试大纲国家电网大纲

今年的专业部分变化较大&#xff0c;关注社长的早在很久前就知道会新增科目&#xff0c;新增科目的对应题库讲义已经编写完成&#xff0c;有需要的学弟可以后台私信我 欢迎大家后台私信咨询~ 公共部分没有变化&#xff0c;考点跟每年一样&#xff0c;考试临近如果时间充足备考…

OpenCV(opencv_apps)在ROS中的视频图像的应用(重点讲解哈里斯角点的检测)

1、引言 通过opencv_apps&#xff0c;你可以在ROS中以最简单的方式运行OpenCV提供的许多功能&#xff0c;也就是说&#xff0c;运行一个与功能相对应的launch启动文件&#xff0c;就可以跳过为OpenCV的许多功能编写OpenCV应用程序代码&#xff0c;非常的方便。 对于想熟悉每个…

JVM之jps虚拟机进程状态工具

jps虚拟机进程状态工具 1、jps jps&#xff1a;(JVM Process Status Tool)&#xff0c;虚拟机进程状态工具&#xff0c;可以列出正在运行的虚拟机进程&#xff0c;并显示虚拟机执 行主类&#xff08;Main Class&#xff0c;main()函数所在的类&#xff09;的名称&#xff0c…

MCU系统的调试技巧

MCU系统的调试技巧对于确保系统稳定性和性能至关重要。无论是在嵌入式系统开发的初期阶段还是在产品维护和优化的过程中&#xff0c;有效的调试技巧可以帮助开发人员快速发现和解决问题&#xff0c;本文将讨论一些MCU系统调试的技巧。 首先&#xff0c;使用调试工具是非常重要…