【重温设计模式】外观模式及其Java示例

设计模式及外观模式介绍

在编程世界中,设计模式就如同自然界的法则,是一种反复出现在各种情况下的通用解决方案。设计模式可以分为创建型、结构型和行为型三大类,每一类都有其独特的应用场景和解决问题的方式。今天,我们要重点解析的是结构型设计模式中的一员——外观模式。

外观模式,有时也被称为"门面模式",是一种提供了一个统一的接口,用来访问子系统中的一群接口的模式。它定义了一个高层接口,使得子系统更容易使用。换句话说,外观模式就像是一个简洁的控制面板,隐藏了复杂的内部实现,让使用者只需通过简单的操作即可完成复杂的任务。

如果你是一个软件开发新手,可能会觉得这些概念有些抽象和难以理解。但不用担心,我们可以通过一个生活中的例子来帮你理解外观模式。


想象一下,你在家中看电视,你需要做的就是拿起遥控器,按下开关按钮,然后选择频道和音量。在这个过程中,你并不需要知道电视的内部结构,也不需要知道电视是如何接收信号,如何发出声音的。这就是外观模式的魅力,它隐藏了复杂的细节,提供了一个简单易用的接口。

在接下来的内容中,我们会深入探讨外观模式的结构和组成部分,并通过具体例子帮助你更好地理解这个设计模式。

外观模式的结构与组成

接着我们深入探讨外观模式的结构与组成。外观模式主要由两个部分组成:外观类和子系统。外观类是对外提供接口的类,它知道哪些子系统负责处理请求,将客户的请求代理给适当的子系统对象。子系统则是实现系统功能的类集合,处理工作后可能会回到外观类,而不是直接回到客户端。

让我们用具体例子来理解一下。假设我们有一个复杂的系统,这个系统由子系统A、子系统B和子系统C组成,每个子系统都有自己的一套操作。如果没有外观模式,客户端需要与这三个子系统直接交互,这就使得客户端的代码变得复杂且难以维护。而有了外观模式,我们可以创建一个外观类,这个类包含了对子系统A、B、C的操作,客户端只需要与这个外观类交互,从而简化了客户端的代码。

class OneMoreFacade {private SubSystemA a;private SubSystemB b;private SubSystemC c;public OneMoreFacade() {a = new SubSystemA();b = new SubSystemB();c = new SubSystemC();}public void doSomething() {a.operationA();b.operationB();c.operationC();}
}

在这个示例中,OneMoreFacade就是我们的外观类,它封装了对子系统的操作,而SubSystemASubSystemBSubSystemC则是子系统。

理解了外观模式的结构与组成后,我们来看看如何在Java中实现外观模式。

Java中的外观模式实例

在我们刚刚了解了外观模式的结构与组成后,现在让我们通过一个具体的Java程序实例,来看看如何在Java中实现外观模式。

假设我们有一个项目,其中包含了多个独立的子系统,例如数据库操作子系统、网络通信子系统以及日志记录子系统等。每个子系统都有其复杂的操作流程,但对于项目的其他部分来说,它们只关心这些子系统提供的服务,而不需要了解其内部的实现细节。这时,我们可以使用外观模式来简化这些子系统的使用。

首先,我们需要创建一个名为OneMoreFacade的外观类,这个类会包含所有子系统的引用,并提供一个统一的接口供其他部分调用:

public class OneMoreFacade {private SubsystemDatabase database;private SubsystemNetwork network;private SubsystemLogger logger;public OneMoreFacade() {database = new SubsystemDatabase();network = new SubsystemNetwork();logger = new SubsystemLogger();}public void execute() {logger.log("Start executing...");database.operate();network.communicate();logger.log("End executing...");}
}

在这个例子中,execute方法就是我们提供给外部的统一接口,它隐藏了各个子系统复杂的操作流程,使得其他部分只需要通过调用execute方法就能使用到这些子系统的服务。

有了这个外观类,我们在主程序中就可以很方便地使用这些子系统了:

public class Main {public static void main(String[] args) {OneMoreFacade facade = new OneMoreFacade();facade.execute();}
}

以上就是在Java中实现外观模式的一个简单例子。通过这个例子,我们可以看到外观模式有效地隐藏了子系统的复杂性,提供了一个统一且简单的接口,使得子系统更易于使用。然而,外观模式并非万能的,它也有其优缺点,接下来我们就来详细分析一下。

外观模式的优缺点

将我们的视线转向外观模式的双面性,我们可以看到它的优点和缺点。外观模式的优点主要体现在它可以为复杂的子系统提供一个简单的接口。这意味着,当我们使用外观模式时,我们只需要与一个简单的外观对象打交道,而不需要关心子系统的复杂性。这无疑大大简化了客户端的操作,同时也降低了客户端与子系统的耦合度。

外观模式将子系统的操作封装在一个方法中,客户端只需要调用这个方法,就可以完成对子系统的操作。

然而,外观模式也有其缺点。由于外观模式对子系统的封装,可能会导致子系统的修改和维护变得困难,因为任何子系统的修改都可能会影响到外观对象。此外,如果子系统过于复杂,外观对象可能会变得庞大而复杂,不利于代码的维护和阅读。

因此,在实际的开发中,我们需要根据实际的需求和场景,权衡外观模式的使用。如果子系统的复杂性对客户端构成了较大的压力,我们可以考虑使用外观模式来简化接口。但如果子系统的修改和维护较为频繁,或者外观对象可能变得庞大复杂,我们则需要谨慎考虑是否使用外观模式。

总结

我们可以使用各种设计模式来解决各种问题,然而我们也需要记住,没有哪一种设计模式是完美的,每一种设计模式都有其优点和缺点。我们需要根据实际情况,选择最适合的设计模式。

外观模式,就像是我们生活中的遥控器,它隐藏了复杂的细节,提供了一个简单的接口。它让我们可以轻松地操作复杂的系统,而不需要了解系统的内部实现。然而,外观模式也有其缺点,它可能会使得子系统的修改和维护变得困难,也可能会使得外观对象变得庞大复杂。

因此,当我们在编程时,我们需要深思熟虑,权衡利弊,选择最适合的设计模式。我们需要记住,设计模式只是我们的工具,而我们的目标是创造出优秀的软件。我们需要用我们的智慧,用我们的创造力,去打破束缚,去创造可能。

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

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

相关文章

【HbuilderX】 uniapp实现 android申请权限 和 退出app返回桌面

目录 android申请权限: 监听用户是否开启权限或关闭权限: 退出app返回桌面: android申请权限: 首先在 manifest.json 内添加你所需要用到权限 添加权限插件 permission.js 一次就好1/权限插件 - Gitee.comhttps://gitee.co…

数据库分库分表中间件选择

目前分库分表的中间件有三种设计思路,分别是: 采用分散式架构,适用于用Java开发的高性能轻量级OLTP应用程序,以Sharding-JDBC为代表。采用中间层Proxy架构,提供了静态输入和所有语言支持,适用于OLAP应用程…

MATLAB环境下基于小波和滤波器组的音频信号处理

音频分类研究的重点,一方面在于音频特征的提取和选择,通常来说数据集和特征集在分类系统中有着极为重要的作用,离开了对数据集的处理、对特征集中特征的提取和选择,分类结果必将产生巨大误差。对于提高音频分类系统的分类准确度和…

vulnhub-----Hackademic靶机

文章目录 1.C段扫描2.端口扫描3.服务扫描4.web分析5.sql注入6.目录扫描7.写马php反弹shell木马 8.反弹shell9.内核提权 1.C段扫描 kali:192.168.9.27 靶机:192.168.9.25 ┌──(root㉿kali)-[~] └─# arp-scan -l Interface: eth0,…

Docker容器(3)单容器管理

一、单容器 1.1概念简介 Docker三个重要概念: 仓库(Repository); 镜像(Image); 容器(Container). *Docker的三个重要概念是仓库(Repository)、镜像(Image)和容器(Container)**。具体如下: **镜像(Image)**:Docker镜像是创建容器的基础,它类似…

Maven面试题

以下是一些关于Maven的经典面试题以及它们的答案: 1、什么是Maven? Maven是一个项目管理工具,用于构建、管理、发布Java项目。 2、为什么要使用Maven而不是手动管理项目依赖? Maven提供了依赖管理、统一的构建、打包、文档生…

Google索引脚本:快速索引你的网站

公众号:【可乐前端】,每天3分钟学习一个优秀的开源项目,分享web面试与实战知识。 每天3分钟开源 hi,这里是每天3分钟开源,很高兴又跟大家见面了,今天介绍的开源项目简介如下: 仓库名&#xff1…

园区停车管理系统的设计与实现

** 🍅点赞收藏关注 → 私信领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅** 一 、设计说明 1.1 选题…

【前端素材】推荐优质在线通用果蔬商城电商网页eStore平台模板(附源码)

一、需求分析 1、系统定义 通用果蔬网站是指专门提供各类果蔬产品展示和销售的在线平台。它将不同种类的新鲜水果、蔬菜、干果、坚果等聚集在一起,为消费者提供方便、快捷的购物渠道。 2、功能需求 通用果蔬网站是指专门提供各类果蔬产品展示和销售的在线平台。…

面试数据库篇(mysql)- 08事务

原理 事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。 ACID是什么?可以详细说一下吗? 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全…

Redis之一: 简介及环境安装搭建

什么是NoSQL? NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。 NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据&#xf…

USB - OTG

USB OTG (On-The-Go) Definition(定义): * USB OTG 可让平板电脑或智能手机等设备充当主机,允许其他 USB 设备(如 USB 闪存驱动器、数码相机、鼠标或键盘)连接到它们。 * 它允许设备在主机和外设之间切换角色。例如&am…

基于SSM SpringBoot vue服装物流管理系统

基于SSM SpringBoot vue服装物流管理系统 系统功能 首页 图片轮播 人个中心 登录注册 后台管理: 登录注册 个人中心 货物信息管理 货物入库管理 订单信息管理 商品出库管理 快递追踪管理 用户管理 供应商信息管理 盘点信息管理 管理员管理 开发环境和技术 开发语言&#xf…

github-actions

文章目录 workflow触发器action市场contextsecrets 默认环境变量 workflow name: {{workflow name}} run-name: {{workflow runs name}}on: {{触发器}} #[push]env:{{定义workflow变量}}: valuejobs:{{job name}}:runs-on: {{运行机器}} #ubuntu-latestenv:{{定义job变量}}: v…

小程序开发能力

小程序开发能力 1. 获取用户头像 当小程序需要让用户完善个人资料时,我们可以通过微信提供的头像、昵称填写能力快速完善。如图: 想使用微信提供的头像填写能力,需要两步: 将 button 组件 open-type 的值设置为 chooseAvatar当…

Python实现时间序列分析动态因子模型(DynamicFactor算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 动态因子模型(Dynamic Factor Models, DFM)是一种统计学和计量经济学中用于处理…

源码安装 HIPIFY 和应用示例,将cuda生态源码转化成HIP生态源码

1,源码下载 GitHub - ROCm/HIPIFY: HIPIFY: Convert CUDA to Portable C CodeHIPIFY: Convert CUDA to Portable C Code. Contribute to ROCm/HIPIFY development by creating an account on GitHub.https://github.com/ROCm/HIPIFY.git git clone --recursive ht…

springboot230基于Spring Boot在线远程考试系统的设计与实现

在线远程考试系统设计与实现 摘 要 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到…

基于JAVA的毕业设计分配选题系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 专业档案模块2.2 学生选题模块2.3 教师放题模块2.4 选题审核模块 三、系统展示四、核心代码4.1 查询专业4.2 新增专业4.3 选择课题4.4 取消选择课题4.5 审核课题 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpri…

vmware虚拟机centos中/dev/cl_server8/root 空间不够

在使用vmware时发现自己的虚拟机的/dev/cl_server8/root空间不够了,没办法安装新的服务。所以查了一下改空间的办法。 1.在虚拟机关闭的状态下,选中需要扩容的虚拟机->设置->硬件-> 硬盘->扩展->填写扩大到的值。 2.打开虚拟机&#xff…