外观模式:简化复杂系统的访问接口

news2025/1/4 16:03:10

外观模式是一种结构型设计模式,它提供了一个统一的接口,用于访问复杂系统中的一组接口。本文将深入探讨外观模式的原理、结构和使用方法,并通过详细的 Java 示例代码来说明。

1. 外观模式的定义

外观模式是一种通过提供一个简化的接口,隐藏系统复杂性的设计模式。它将一组复杂的子系统封装在一个外观类中,为客户端提供一个统一的接口,以简化对子系统的访问。

2. 外观模式的结构

外观模式包含以下几个核心角色:

  • 外观(Facade):外观类是外观模式的核心,它知道哪些子系统类负责处理请求,并将客户端的请求委派给适当的子系统对象。
  • 子系统(Subsystem):子系统类是实现子系统功能的类,处理外观类指派的任务。子系统类可以是单个类,或者是一组相关的类。

下图展示了外观模式的结构:

 

3. 外观模式的工作原理

外观模式的工作原理可以简述如下:

  1. 定义外观类,该类封装了一组复杂子系统的接口,并提供一个统一的接口给客户端使用。
  2. 定义子系统类,实现子系统的具体功能。
  3. 在外观类中,将客户端的请求委派给适当的子系统对象,并协调子系统对象之间的交互。
  4. 客户端通过外观类的接口访问子系统功能,无需直接与子系统类交互。

4. Java 示例代码

下面通过一个简单的 Java 示例代码来演示外观模式的使用。

首先,我们定义子系统类 SubsystemASubsystemB 和 SubsystemC,分别表示子系统的不同功能:

public class SubsystemA {
    public void operationA() {
        System.out.println("SubsystemA: operationA");
    }
}

public class SubsystemB {
    public void operationB() {
        System.out.println("SubsystemB: operationB");
    }
}

public class SubsystemC {
    public void operationC() {
        System.out.println("SubsystemC: operationC");
    }
}

然后,我们定义外观类 Facade,封装了子系统的接口,并提供一个统一的接口给客户端使用:

public class Facade {
    private SubsystemA subsystemA;
    private SubsystemB subsystemB;
    private SubsystemC subsystemC;

    public Facade() {
        subsystemA = new SubsystemA();
        subsystemB = new SubsystemB();
        subsystemC = new SubsystemC();
    }

    public void operation() {
        subsystemA.operationA();
        subsystemB.operationB();
        subsystemC.operationC();
    }
}

最后,我们在客户端中使用外观模式,通过外观类的接口访问子系统功能:

public class Client {
    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.operation();
    }
}

输出结果为:

SubsystemA: operationA
SubsystemB: operationB
SubsystemC: operationC

从输出结果可以看出,通过外观模式,我们成功地通过外观类的接口访问了子系统的功能,无需直接与子系统类交互。

5. 外观模式的优点和适用场景

外观模式具有以下优点:

  • 简化接口:外观模式通过提供一个统一的接口,简化了复杂系统的访问接口,使得系统更易于使用。
  • 解耦子系统:外观模式将客户端与子系统之间的依赖关系解耦,使得子系统的变化不会影响到客户端。
  • 隐藏复杂性:外观模式将复杂的子系统隐藏在外观类中,使得客户端无需了解子系统的实现细节。

外观模式适用于以下场景:

  • 需要简化复杂系统的访问接口,提供一个统一的接口给客户端使用。
  • 需要将客户端与子系统之间的依赖关系解耦,使得系统更易于维护和扩展。
  • 需要隐藏复杂系统的实现细节,提供一个简单的接口给客户端使用。

6. 总结

外观模式是一种通过提供一个简化的接口,隐藏系统复杂性的设计模式。通过外观模式,我们可以简化复杂系统的访问接口,解耦客户端与子系统之间的依赖关系,并隐藏复杂系统的实现细节。外观模式适用于需要简化接口、解耦子系统、隐藏复杂性的场景。

公众号请关注"果酱桑", 一起学习,一起进步!
 

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

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

相关文章

LoggerFactory is not a Logback LoggerContext but Logback is on the classpath

springboot项目报错如下: 这个错误是由于在你的Java代码中使用了Logback日志库,但是同时又存在与Logback竞争的其他日志库(例如slf4j-simple)导致的冲突。 要解决这个问题,你可以尝试以下几个步骤: 1. 检…

计算机网关原理、子网掩码原理(路由器、交换机)(网关:与以太网接口关联的路由)

文章目录 网关网关的历史网关的功能网关的原理相关疑问为什么用子网掩码与IP地址进行与运算来确定一个IP地址所属的子网?网关地址是谁定的,是配置路由的人随意定的吗?(配置人员定的)如何正确设置网关地址(路…

WPF 如何引入图标文件

文章目录 前言:WPF 引入图标什么是ttf字体阿里云矢量库下载WPF引用为什么文件路径是#iconfont而不是iconfont。前面为什么要带个#号? 前言: 我最近在研究WPF,吃饭嘛,桌面端实在是不想用Winform,太丑了。WP…

WebDAV之π-Disk派盘+Notability

Notability 支持WebDAV方式连接π-Disk派盘。 Notability是一款功能强大的数字笔记应用,适用于iOS和macOS。它提供了优秀的手写体验,支持手写、录音和多种标记。用户可以记录想法、思路、绘图和草图,进行注释和标记,实现高效的学习和创作。同时,Notability具有文本输入、…

16 Java获取随机数

使用new Random创建一个随机数对象,然后调用里面的nextInt方法,方法中传入一个数字n,则随机数的范围为[0,n)。代码如下: package demo;import java.util.Random;public class Demo10 {public static void main(String…

xilinx zc706 以太网性能测试(iperf)

一:概述 以太网流量测试是一种评估网络性能和容量的测试方法。它通过模拟实际网络环境中的数据流量,以确定网络在高负载情况下的表现。 在以太网流量测试中,可以使用各种工具和技术来生成和控制数据流量。这些工具可以模拟不同类型的流量&a…

C#基础学习_集合中对象的动态排序

C#基础学习_集合中对象的动态排序 上一期我们了解了Icompare这种默认的排序方法,本次我们学习一下比较器ICompare的应用(可以替代Icompare这种默认的排序方法) 因为默认排序,只能有一种,使用起来可能会有局限性。 此时需要添加比较器: 根据需要,在需要实现动态排序的类…

生产管理“看得见“,这些车间工具必不可少!

工厂可视化是精益管理的重要组成部分,可视化的工厂管理可以从侧面提高员工精益生产的意识,那么工厂车间哪些方面可以做可视化管理呢? 目视化管理包括了三个内容: 1、管理规则的目视化:如通道线、安全警示、作业指导书…

掌握AI图像篡改检测工具,轻松识别图片造假

文章目录 一、前言1.1 背景与危害1.2会议探讨1.3 技术先行 二、亮点技术1:AI图像篡改检测技术2.1 传统方法Python实现步骤2.2 合合信息——PS纂改检测体验 三、亮点技术2:生成式图像鉴别3.1 生成式图像安全问题3.2 传统方法Python实现步骤3.2 合合信息—…

力扣 376. 摆动序列

题目来源:https://leetcode.cn/problems/wiggle-subsequence/description/ C题解1:使用flg标记第一个是增还是减,如果是平,则直接返回1;根据标记的flg,不断更新顶峰值和谷底值,直到最高或者最低…

LabVIEW使用数据引用减少内存

概览 NI LabVIEW 省略了 开发 软件时 需要 手动 管理 内存。LabVIEW 编译器 始终 会 分析 您 的 代码, 以 确定 如何 优 化 性能 并 减少 所需 的 内存 量。但是, 想要 更多 控制 内存 分配 的 高级 用户 可以 在 LabVIEW 2009 中创建 数据 引用。 内容…

记录一些杂七杂八的数据分析

1、数据库的独立性 --模式与内模式的映射 保证数据库物理结构的独立性 --模式与外模式的映射 保证数据库逻辑结构的独立性 2、常见的数据库 Oracle数据库,SQL Server数据库,MySQL数据库,PostgreSQL数据库。 3、数据分类 &…

day 52 子序列问题

不连续递增子序列的跟前0-i 个状态有关,连续递增的子序列只跟前一个状态有关 300. 最长递增子序列 dp[i]定义:以nums[i]结尾的最长递增子序长度递推公式:if (nums[i] > nums[j]) dp[i] max(dp[i], dp[j] 1); num[i] 之前各个位置,如果…

[静态库和动态库][VS2022]

静态库和动态库 前言:一、静态库二、动态库三、静态库和动态库的使用 前言: 我们写代码,可以分模块去写,最后可以协作,能整合起来; 可以吧代码的实现和声明分离。 比如:我的这篇博客C语言猜拳小…

【雕爷学编程】Arduino动手做(160)---HLK-V20离线语音模块

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&#x…

数据从发出到接收的细节介绍{封装与解封装}

系列文章目录 数通王国历险记(5) 目录 前言 一,数据封装的全过程 1.1,应用层的封装形式 1.2,传输层的封装形式 理解: 1.3,网络层的封装形式 理解: 1.4,数据链路层…

云计算——云计算关键技术

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​ 目录 前言 一.云计算关键技术 1.虚拟化技术 2.分布式数据存储技术 (1&…

数据可视化之Tableau可视化||绘制标靶图

标靶图是一种用于评估、测试和优化计算机视觉算法的基准测试工具。它通常由多个具有不同特征的目标物体组成,如车辆、行人、交通信号灯等,同时包括各种不同的复杂场景,如城市街道、高速公路和人行道等。通过使用标靶图,研究人员可以检验算法的准确性、速度和适应性,同时拓…

【Linux指令集】---ls指令(超详细)

个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【Linux专栏】🎈 本专栏旨在分享学习Linux的一点学习心得,欢迎大家在评论区讨论💌 演示环境&#xff1…

公网IP证书

一、IP证书是什么? ip证书是用于公网ip地址的SSL证书,与我们通常所讲的SSL证书并无本质上的区别,但由于SSL证书通常颁发给域名,而组织机构需要公共ip地址的SSL证书,这类SSL证书就是我们所说的ip证书。ip证书具有安全、…