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

article/2024/5/21 21:59:11

设计模式及外观模式介绍

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

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

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


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

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

外观模式的结构与组成

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

让我们用具体例子来理解一下。假设我们有一个复杂的系统,这个系统由子系统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.ngui.cc/article/show-1927676.html

相关文章

PostGIS docker版本升级(12-3.2升级到14-3.4)

备份数据 进入容器:docker exec -it postgres bash备份数据:mkdir -p /var/lib/postgresql/data/bakup;pg_dumpall -U postgres > /var/lib/postgresql/data/bakup/bakupall.sql 升级容器 首先删除容器:docker-compose down…

Tomcat 漏洞处理

1.目录遍历 要求不允许通过网址访问 Tomcat 的 example ,manager 等自带目录,我选择了最直接的办法,删除 Tomcat 中 webapps 目录下除了项目外的其它所有文件夹。 2.Tomcat AJP 修改 Tomcat 配置文件 /root/apache-tomcat-7.0.109/conf/se…

容器安全工具使用指南:保障容器环境安全的利器

随着容器技术的广泛应用,容器安全成为关注的焦点。本文将深入介绍几个流行的容器安全工具,我们将深入了解容器安全领域的Top 10工具,包括Trivy、veinmind-tools、Clair、Docker Bench for Security、Sysdig Falco、neuVector等,详细讲解它们的功能、原理、安装和使用方法,…

Appium + mitmProxy 实现APP接口稳定性测试

随着 App 用户量的不断增长,任何小的问题都可能放大成严重的线上事故,为了避免对App造成损害的任何可能性,我们必须从各个方面去思考 App 的稳定性建设,尽可能减少任何潜在的威胁。 1.背景介绍 为了保障 App 的稳定性&#xff0…

阿里云能处!2024年ta真降价呀!附服务器优惠价格表

阿里云能处,关键时刻ta真降价啊!2024新年伊始阿里云带头降价了,不只是云服务器,云数据库和存储产品都降价,阿里云新老用户均可购买99元服务器、199元服务器,续费不涨价,阿里云百科aliyunbaike.c…

Making Dynamic Page Coalescing Effective on Virtualized Clouds——论文泛读

EuroSys 2023 Paper 论文阅读笔记整理 问题 在现代计算机系统中,转换后备缓冲器(TLB)容量不能与存储器容量相同的速率进行扩展[1,2]。地址转换开销已成为许多大内存工作负载的主要性能瓶颈[3-19]。在虚拟化云中,用硬…

曾桂华:车载座舱音频体验探究与思考| 演讲嘉宾公布

智能车载音频 I 分论坛将于3月27日同期举办! 我们正站在一个前所未有的科技革新的交汇点上,重塑我们出行体验的变革正在悄然发生。当人工智能的磅礴力量与车载音频相交融,智慧、便捷与未来的探索之旅正式扬帆起航。 在驾驶的旅途中&#xff0…

nginx 局部配置

event模块 events { worker_connections 65536; #设置单个工作进程的最大并发连接数 use epoll; #使用epoll事件驱动,Nginx支持众多的事件驱动,比如:select、poll、epoll,只能设置在events模块中设置。 accept_mutex on; #on为同…

视觉三维重建colmap框架的现状与未来

近两年AI技术的火热尤其是nerf和gaussian splatting的出现,又将colmap推了一把,传统mvs的地位仿佛受到了挑战,虽然说nerf/gs的效果是无法胜任传统mvs的精度,但是作为"看看"的条件,是远远足够了。且传统重复纹…

C语言基础知识:数据在内存中的存储解析(整数,浮点数)

和黛玉学编程..............> 整数在内存的存储 之前就说过,数字二进制有3种保存方法,原码,反码,补码;而电脑存储整数的时候使用补码,这是因为cpu中只有加法器 三种表示方法都有符号位和数字位&#xff…