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 ,又能防止其中方法被不合理的访问。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Zeus IoT : 基于 SpringBoot 的分布式开源物联网大数据平台

Zeus IoT 是一个集设备数据采集、存储、分析、观测为一体的开源物联网平台,全球首创基于 Zabbix 的物联网分布式数据采集架构,具备超百万级物联网设备的并发监控能力,真正具备工业级性能与稳定性的开源物联网大数据中台。 Zeus IoT 致力于让设…

Zinx框架-游戏服务器开发002:框架学习-按照三层结构模式重构测试代码+Tcp数据适配+时间轮定时器

文章目录 1 Zinx框架总览2 三层模式的分析3 三层重构原有的功能 - 头文件3.1 通道层Stdin和Stdout类3.1.2 StdInChannel3.1.2 StdOutChannel 3.2 协议层CmdCheck和CmdMsg类3.2.1 CmdCheck单例模式3.2.1.1 单例模式3.2.1.2 * 命令识别类向业务层不同类别做分发 3.2.2 CmdMsg自定…

Node.js |(五)包管理工具 | 尚硅谷2023版Node.js零基础视频教程

学习视频:尚硅谷2023版Node.js零基础视频教程,nodejs新手到高手 文章目录 📚概念介绍📚npm🐇安装npm🐇基本使用🐇生产依赖与开发依赖🐇npm全局安装🐇npm安装指定包和删除…

4、Python基本数据类型:数字、字符串、列表、元组、集合、字典

文章目录 1、Python基本数据类型简介2、数字3、字符串4、列表5、元组6、集合7、字典1、Python基本数据类型简介 Python是一种非常强大且易于学习的编程语言,它具有简洁的语法和丰富的数据类型。了解和掌握Python的基本数据类型是学习和使用Python的基础。本文将详细介绍Pytho…

Disk Drill v5.3.1313(数据恢复备份)

Disk Drill是一款功能强大的数据恢复软件,它可以帮助用户恢复已删除、丢失、格式化或损坏的文件,并支持多种存储设备,包括计算机硬盘驱动器、外部硬盘、USB闪存驱动器、内存卡和其他存储介质。它和很多的文件系统都兼容,比如&…

nodejs express uniapp 图书借阅管理系统源码

开发环境及工具: nodejs,mysql5.7,HBuilder X,vscode(webstorm) 技术说明: nodejs express vue elementui uniapp 功能介绍: 用户端: 登录注册 首页显示轮播图&am…

排序算法的分析及实现

目录​​​​​​​ 1. 排序 1.1. 排序的概念 1.2. 排序的稳定性 1.3. 内部排序和外部排序 2. 直接插入排序 2.1. 直接插入排序 2.2. 直接插入排序的两种情况 1. 情况一 2. 情况二 2.3. 直接插入排序的单趟排序 2.4. 直接插入排序的完整实现 2.5. 直接插入排序的时…

【江协科技-用0.96寸OLED播放知名艺人打篮球视频】

Python进行视频图像处理,通过串口发送给stm32,stm32接收数据,刷新OLED进行显示。 步骤: 1.按照接线图连接好硬件 2.把Keil工程的代码下载到STM32中 3.运行Python代码,通过串口把处理后的数据发送给STM32进行显示 …

【图像分类】【深度学习】【Pytorch版本】AlexNet模型算法详解

【图像分类】【深度学习】【Pytorch版本】AlexNet模型算法详解 文章目录 【图像分类】【深度学习】【Pytorch版本】AlexNet模型算法详解前言AlexNet讲解卷积层的作用卷积过程特征图的大小计算公式Dropout的作用AlexNet模型结构 AlexNet Pytorch代码完整代码总结 前言 AlexNet是…

论文阅读——What Can Human Sketches Do for Object Detection?(cvpr2023)

论文:https://openaccess.thecvf.com/content/CVPR2023/papers/Chowdhury_What_Can_Human_Sketches_Do_for_Object_Detection_CVPR_2023_paper.pdf 代码:What Can Human Sketches Do for Object Detection? (pinakinathc.me) 一、 Baseline SBIR Fram…

Cesium:WFS请求两种方式

以本地发布的上海市浦东区行政区划WMS地图服务为例,讲述Cesium中WFS请求的两种方式及其优缺点。 服务加载地址及其参数如下, 服务加载地址:http://localhost:8089/geoserver/pudong/wms 加载参数:layerName:pudong:distractservice: "WMS",request: "GetMa…

8-2、T型加减速计算简化【51单片机控制步进电机-TB6600系列】

摘要:本节介绍简化T型加减速计算过程,使其适用于单片机数据处理。简化内容包括浮点数转整型数计算、加减速对称处理、预处理计算 一、浮点数转整型数计算 1.1简化∆t_1计算 根据上一节内容已知 K0.676 step1.8/X(x为细分值,1.8对…

【Leetcode】349. 两个数组的交集

题意 给定两个数组,编写一个函数来计算它们的交集。 说明: 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。 思路 这道题目,主要要学会使用一种哈希数据结构:unordered_set,这个数据结构可以解决…

MYSQL:主从复制简述

(图片来自于马士兵教育) 从节点的I/O线程会请求主节点的Binlog,并且将得到的Binlog写入到本地relay_log(中继日志)中,SQL线程会读取realy_log中的日志文件,并且解析成SQL逐行执行。 主库会生成…

XSS漏洞利用工具BeEF

BeEF是Browser Exploitation Framework的缩写。随着人们越来越多地关注针对包括移动客户端在内的客户端的网络传播攻击,BeEF使专业的渗透测试人员可以使用客户端攻击向量来评估目标环境的实际安全状况。与其他安全框架不同,BeEF超越了硬化的网络边界和客…

win11下使用VMmare设置CentOS7里面的静态IP

1,win11上的VMware 8 设置 2,选择VMmare上的虚拟网络编辑进行设置 #3,接下来进入虚拟机设置(就是进入CentOS7 打开终端 右键 Open Terminal ) # 切换root su root #ksana #编辑网络配置文件 vi /etc/sysconfig/networ…

【LeetCode:318. 最大单词长度乘积 | 模拟 位运算】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

nn.embedding函数详解(pytorch)

提示:文章附有源码!!! 文章目录 前言一、nn.embedding函数解释二、nn.embedding函数使用方法四、模型训练与预测的权重变化探讨 前言 最近发现prompt工程(如sam模型),也有transform的detr模型等都使用了nn.Embedding函…

GB28181学习(十五)——流传输方式

前言 基于GB/T28181-2022版本,实时流的传输方式包括3种: UDPTCP被动TCP主动 UDP 流程 注意: m字段指定传输方式为RTP/AVP; 抓包 SIP服务器发送INVITE请求; INVITE sip:xxx192.168.0.111:5060 SIP/2.0 Via: SIP…

【C++】智能指针【内存泄漏|智能指针原理及使用|RAII】

目录 1、了解内存泄露 1.1 内存泄漏的定义及危害 1.2 内存泄漏分类(了解) 1.3 如何检测内存泄漏(了解) 1.4如何避免内存泄漏 2、智能指针的引出 3、智能指针的使用及原理 3.1 RAII 3.2 智能指针的原理 3.3 std::auto_pt…