揭秘外观模式:简化复杂系统的关键设计策略

前言

外观模式(Facade Pattern)是一种结构型设计模式,它隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计模式向现有的系统添加一个接口,来隐藏系统的复杂性。这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。
在软件工程中,外观模式主要用于简化接口和封装调用,特别是当需要调用多个复杂的子系统时。通过引入一个高层接口,外观模式能够使得子系统更加容易使用。

外观模式的结构

外观模式通常包括以下角色:

  1. Facade(外观):这是系统中唯一与客户端交互的类。它为客户端提供一组简化的接口,用于访问子系统中的功能。外观类知道如何组织这些子系统来完成客户端的请求。

  2. Subsystem(子系统):子系统包含一系列的类,这些类实现了系统的部分功能。通常,这些类之间存在相互依赖关系,对外表现为复杂的操作接口。

  3. Client(客户端):客户端是使用外观类的消费者。通过外观类,客户端可以访问到子系统中的功能,而无需直接与子系统的各个部分进行交互。

以上角色的关系如图表示:
在这里插入图片描述
其中,Subsystem1和Subsystem2是两个子系统接口,它们分别定义了不同的操作。ConcreteSubsystem1和ConcreteSubsystem2是这两个接口的具体实现。Facade是外观类,它包含了对子系统的引用,并提供了统一的request()方法供客户端调用。

在Java中的应用

在Java中,外观模式可以通过创建一个或多个外观类来实现,这些类封装了对子系统的访问和操作。例如,如果有一个复杂的文件系统操作,可以创建一个外观类来简化文件的打开、读取、写入和关闭操作。

class FileSystem {public void openFile() { /* ... */ }public void readFile() { /* ... */ }public void writeFile() { /* ... */ }public void closeFile() { /* ... */ }
}class FileSystemFacade {private FileSystem fileSystem;public FileSystemFacade(FileSystem fileSystem) {this.fileSystem = fileSystem;}public void performOperations() {fileSystem.openFile();fileSystem.readFile();fileSystem.writeFile();fileSystem.closeFile();}
}

在这个例子中,FileSystem类代表了复杂的子系统,而FileSystemFacade类则是外观类,它提供了一个简化的接口performOperations(),用于执行一系列文件操作。

优点

  1. 简化接口:外观模式为复杂的子系统提供了一个简洁的接口,使得客户端无需了解子系统内部的复杂逻辑。

  2. 减少依赖:客户端只依赖于外观类,从而减少了客户端与子系统之间的依赖关系,提高了系统的可维护性和扩展性。

  3. 提高可用性:外观模式可以封装子系统的变化,保护客户端免受影响,从而提高系统的可用性。

  4. 分层设计:通过外观类,可以将不同的子系统组合起来形成一个层次结构的系统,每一层都只需要与其下一层交互。

缺点

  1. 增加抽象层:引入外观类意味着增加了系统的抽象层,这可能会导致系统的性能有所下降。

  2. 可能违反单一职责原则:如果外观类的职责过多,可能会违反单一职责原则,导致外观类变得臃肿。

  3. 限制直接访问:客户端不能直接访问子系统中的类,这可能会在某些情况下限制客户端的功能。

应用场景

外观模式的核心在于引入一个外观类,这个类为复杂的子系统提供一个简单的接口,使得客户端不需要直接与子系统的内部组件进行交互。外观模式的应用场景主要包括:

  1. 简化接口:当一个系统具有复杂的多个子系统时,外观模式可以提供一个统一的高层接口,简化客户端的操作。
  2. 减少依赖:通过外观角色,客户端对子系统的依赖性降低,从而减少了系统的耦合度。
  3. 提高可用性:外观模式可以隐藏子系统的复杂性,使得客户端无需了解复杂的实现细节,从而提高了系统的易用性。
  4. 控制访问:外观模式还可以用于控制对子系统内部组件的访问,从而实现对子系统的安全访问或者访问控制。
  5. 优化性能:有时候,通过外观角色可以进行一些性能优化,比如缓存子系统的数据,减少对子系统的频繁访问。
  6. 重构遗留系统:在对遗留系统进行重构时,外观模式可以用来逐步替换旧的系统组件,而不会影响到其他部分的正常使用。

结论

在实际应用中,外观模式可以帮助我们更好地组织和管理代码,提高系统的可维护性和扩展性。如果你需要提供一个统一的接口来简化系统的复杂性,且不考虑客户端直接访问那么请采用外观模式吧。

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

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

相关文章

【C语言】实现单链表

目录 (一)头文件 (二)功能实现 (1)打印单链表 (2)头插与头删 (3)尾插与尾删 (4) 删除指定位置节点 和 删除指定位置之后的节点 …

k8s搭建容器云平台

平台部署–部署容器云平台 部署kubernets 1.22.1集群 curl -O http://...../chinaskills_cloud_paas_v2.0.2.iso mount chinaskills_cloud_paas_v2.0.2.iso /mnt cp -rvf /mnt/* /opt cp /opt/kubeeasy /usr/bin kubeeasy --help#[install dependencies package cluster]kube…

什么是依赖注入?如何在Spring中配置和使用依赖注入?

什么是依赖注入? 依赖注入(Dependency Injection,DI)是一种设计模式,它通过将对象之间的依赖关系的创建和维护转移到外部容器中来,以减少对象之间的紧耦合性并提高可重用性。在传统的程序设计中&#xff0c…

蓝桥杯嵌入式第9届真题(完成) STM32G431

蓝桥杯嵌入式第9届真题(完成) STM32G431 题目 分析和代码 main.h /* USER CODE BEGIN Header */ /********************************************************************************* file : main.h* brief : Header for main.c file.* …

[ai笔记4] 将AI工具场景化,应用于生活和工作

欢迎来到文思源想的AI空间,这是技术老兵重学ai以及成长思考的第4篇分享内容! 转眼已经到了大年初三,但是拜年的任务还只完成了一半,准备的大部头的书,现在也就看了两本,还好AI笔记通过每天早起坚持了下来。…

Java-并发高频面试题-2

接着之前的Java-并发高频面试题 7. synchronized的实现原理是怎么样的? 首先我们要知道synchronized它是解决线程安全问题的一种方式,而具体是怎么解决的呢?主要是通过加锁的方式来解决 在底层实现上来看 是通过 monitorenter、monitorexit…

java实战:基于Redis的ZSet实现秒级排行榜

本文将介绍如何使用Redis的ZSet(有序集合)来实现一个秒级排行榜。展示如何使用Java和Jedis库来创建、更新和获取排行榜数据。通过本文,可以了解到如何在Java应用程序中使用Redis的ZSet来实现一个高性能的秒级排行榜。 一、ZSet概述 Redis的…

【Spring原理进阶】SpringMVC调用链+JSP模板应用讲解

🎉🎉欢迎光临🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟特别推荐给大家我的最新专栏《Spring 狂野之旅:底层原理高级进阶》 &#x1f680…

【Python网络编程之Ping命令的实现】

🚀 作者 :“码上有前” 🚀 文章简介 :Python开发技术 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 Python网络编程之Ping命令的实现 代码见资源,效果图如下一、实验要求二、协议原理2…

所谓的意志力,也许根本就不存在

许多讲自我提升的书,往往会把成功的原因归结为两点:自律,以及专注。 他们会告诉你:为什么别人能够成功、而你不能?第一是你不够自律,无法每天雷打不动地坚持「好习惯」;第二,是你不够…

[Java][算法 滑动窗口]Day 02---LeetCode 热题 100---08~09

第一题 无重复字符串的最长子串 思路 其实就是在字符串S中 找到没有重复的最长子串的长度 这道题的难点就是在于如何判断最长并且无重复 首先 最长长度 可以使用变量max记录保存 再者 判断有无重复 最简单的方法就是 暴力遍历法 即对于每次找的子串都再次寻找遍历…

操作字符串之子串替换-13-${string//substring/replacement}

1.${string//substring/replacement} 使用$replacement来替换所有匹配的$substring 2.实例 操作字符串样例:stringabc123ABC456xyzabc 字符串操作默认从左边开始进行 命令: echo ${string//abc/ZTJ} [rootkibana ~]# echo ${string//abc/ZTJ} ZTJ…

Validation-参数校验框架

在代码完成后期,为保证数据的正确性和完整性,需要在后端对接口请求的参数进行校验。使用Spring的Validation框架,通过添加注解就可以完成参数校验,不用写if/else来逻辑判断了。 使用该框架,首先在请求参数接收层也就是controller层上方标注V…

【Chrono Engine学习总结】5-sensor-5.1-sensor基础并创建一个lidar

由于Chrono的官方教程在一些细节方面解释的并不清楚,自己做了一些尝试,做学习总结。 1、Sensor模块 Sensor模块是附加模块,需要单独安装。参考:【Chrono Engine学习总结】1-安装配置与程序运行 Sensor Module Tutorial Sensor …

【国产MCU】-CH32V307-基本定时器(BCTM)

基本定时器(BCTM) 文章目录 基本定时器(BCTM)1、基本定时器(BCTM)介绍2、基本定时器驱动API介绍3、基本定时器使用实例CH32V307的基本定时器模块包含一个16 位可自动重装的定时器(TIM6和TIM7),用于计数和在更新新事件产生中断或DMA 请求。 本文将详细介绍如何使用CH32…

苹果Mac键盘如何将 F1 到 F12 取消按Fn

苹果电脑安装了Win10操作系统之后,F1到F12用不了怎么办的解决方法。本文将介绍一些解决方法,帮助您解决无法使用F1到F12功能键的问题。 使用 Mac系统的人都知道,Mac系统默认是没有开启 F1-F12 的使用的,平时我们使用的系统都可以使…

AcWing 802. 区间和 离散化

文章目录 题目链接题目描述解题思路代码实现总结 题目链接 链接: AcWing 802. 区间和 题目描述 解题思路 离散化是一种常用的技巧,它能够将原始的连续数值转换为一组离散的值,从而简化问题的处理。在这段代码中,离散化的过程主要分为三个步…

2024全栈元年-thinkphp-数据操作

thinkphp 数据相关操作 1.单数据查询 1、单数据查询 ,Db::table(‘tp_stu’) 必须加前缀 2、如果只是查询符合条件的使用where find,如果没有符合条件的返回null 3、使用 findOrFail 没有数据会抛出异常 4、使用 findOrEmpty 没有数据会返回【】 5、得到最近一个原生SQL …

C++重新入门-指针篇

C 中的指针是一种非常重要的数据类型,它们存储了内存地址,可以用来直接访问和操作内存中的数据。指针提供了灵活性和直接性,但也需要谨慎使用,因为误用指针可能导致程序崩溃或安全漏洞。以下是对 C 指针的详细解释: 1…

那些也许你不知道的操作符!

前言 操作符有很多种,目前我们已经了解了一部分 例如最简单的、-、*、/、,还有我们学到的&&,||,!等,但是操作符可不是就只有这么些的,让我们一起来看看吧 目录 1. 移位操作符 原码、反码、补码…