门面模式详解:提高代码可维护性的利器

news2024/9/25 15:02:09

门面模式是一种结构型设计模式,它通过为复杂的子系统提供一个统一的接口,使得子系统更容易使用。门面模式隐藏了系统的复杂性,并向客户端提供了一个简化的接口。

一,门面模式的结构

门面模式(Facade Pattern)的结构通常包括以下几个主要部分:

  1. Facade(门面): 提供一个简化的接口,供客户端使用。它将客户端的请求委派给适当的子系统对象。
  2. Subsystem Classes(子系统类): 一组类,它们实现了子系统的功能。子系统不知道门面的存在,它们直接处理请求并完成工作。
  3. Client(客户端): 使用门面来与子系统交互,而不是直接与子系统类交互。

uml类图:
在这里插入图片描述

二,示例代码

下面是一个简单的门面模式示例,展示了如何使用门面模式简化子系统的使用。

// 子系统1
class Subsystem1 {
    public void operation1() {
        System.out.println("Subsystem1 operation1");
    }
}

// 子系统2
class Subsystem2 {
    public void operation2() {
        System.out.println("Subsystem2 operation2");
    }
}

// 子系统3
class Subsystem3 {
    public void operation3() {
        System.out.println("Subsystem3 operation3");
    }
}

// 门面类
class Facade {
    private Subsystem1 subsystem1;
    private Subsystem2 subsystem2;
    private Subsystem3 subsystem3;

    public Facade() {
        subsystem1 = new Subsystem1();
        subsystem2 = new Subsystem2();
        subsystem3 = new Subsystem3();
    }

    public void operation() {
        subsystem1.operation1();
        subsystem2.operation2();
        subsystem3.operation3();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.operation();
    }
}

在这个示例中,Facade 类提供了一个简化的接口,客户端可以通过这个接口与多个子系统(Subsystem1、Subsystem2 和 Subsystem3)进行交互,而不需要直接与它们打交道。

三,优点

  1. 简化接口:通过提供一个统一的接口,门面模式简化了子系统的使用。
  2. 松散耦合:门面模式减少了客户端与子系统之间的耦合,使得子系统的修改不会影响到客户端。
  3. 更好的分层:门面模式可以帮助我们更好地组织代码,使得系统的分层更加清晰。

四,缺点

  1. 单一职责原则:门面类可能会承担过多的职责,变得过于复杂。
  2. 性能问题:在某些情况下,门面模式可能会引入额外的性能开销。

五,适用场景

  1. 子系统复杂:当一个子系统非常复杂,且客户端需要频繁地与之交互时,可以使用门面模式简化接口。
  2. 分层结构:在分层结构中使用门面模式,可以让每一层只与其相邻的层交互,从而减少耦合。

六,总结

门面模式通过提供一个统一的接口,简化了客户端与子系统的交互,减少了耦合,并使系统结构更加清晰。它适用于子系统复杂且需要频繁交互的场景,以及需要分层结构的系统设计。


如果你对设计模式、软件架构、编程技巧等内容感兴趣,欢迎关注我们的同名微信公众号【技术拾光者】。在这里,我们将定期分享最新的技术文章和实用的编程技巧,帮助你不断提升自己的技术水平。

扫描下方二维码,立即关注我们吧!
技术拾光者

感谢你的阅读和支持,我们期待与你在微信公众号上交流更多有趣的技术话题!

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

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

相关文章

有没有遇到过Mybatisplus插件失效?

背景 相信mybatisplus应该很多人都用过,当然有些人在项目中使用的是tk.mybatis,那么今天说到这个话题原理都是一样,首先mybatisplus会有很多插件,这些插件都会形成一个拦截器链路,具体可以学习下原理,这个地方就不过多叙说了,毕竟不是本篇博文的重点,那言归正传,比如…

普渡大学和麻省理工学院合作开发集成视触觉指尖传感器的5自由度抓手

虽然机器人已经开始在现代制造业、医疗、服务业等领域进行渗透,但对于机器人尤其是机械臂的操作能力,仍然有很大的提升空间,传统多指机器人手虽然能够实现复杂的操作任务,但其高度冗余性也带来了不必要的复杂性。近日来自普渡大学…

WebRTC中的维纳滤波器实现详解:基于决策导向的SNR估计

目录 1. 维纳滤波器的基本原理2. WebRTC中的维纳滤波器实现3. 代码逐步剖析4. 总结 在WebRTC的噪声抑制模块中,维纳滤波器(Wiener Filter)是一种非常常见且重要的滤波器,用于提高语音信号的清晰度并抑制背景噪声。本文将详细解释维…

Hugging Face Transformer:从原理到实战的全面指南

一、前言 我们知道ChatGPT和所有预训练大语言模型的核心是什么?其实就是 Transformer,Hugging Face 的火爆离不开他们开源的这个 Transformers 库。这个开源库里有数万个我们可以直接调用的模型。很多场景下,这个开源模型已经足够我们使用了。…

【Pyside】pycharm2024配置conda虚拟环境

知识拓展 Pycharm 是一个由 JetBrains 开发的集成开发环境(IDE),它主要用于 Python 编程语言的开发。Pycharm 提供了代码编辑、调试、版本控制、测试等多种功能,以提高 Python 开发者的效率。 Pycharm 与 Python 的关系 Pycharm 是…

2024年9月24日---关于MyBatis框架(3)

五 Mybatis的缓存 5.1 Mybatis缓存简介 缓存(cache):提前把数据存放到缓存当中,下一次再使用的时候,直接从缓存中拿,而不用再次去数据库中查询一次了。这样的优势在于:通过减少IO的⽅式,来提⾼程序的执⾏…

28岁打算转行靠谱么,这个年龄转行,有什么适合的行业么?

前言 大家好,我是职场小油条播妞,最近被一组表情包洗脑了。 (强哥表情包我就不放了,大家自行脑补) 我要让老板知道,招我进来,就要承担一定的风险 既然领导把岗位交给咱,证明这岗位…

short-link笔记

1.Accessors(chain true) (见于Result类的注解) 不写默认为false,当该值为 true 时,对应字段的 setter 方法调用后,会返回当前对象。 -->可用于链式编程 参:Accessors 注解详解-CSDN博客 2.关键信息脱敏 利用将class通过jackon序列化为…

Azure Data Box 80 TB 现已在中国区正式发布

我们非常高兴地宣布,Azure Data Box 80 TB SKU现已在 Azure 中国区正式发布。Azure Data Box 是 Azure 的离线数据传输解决方案,允许您以快速、经济且可靠的方式将 PB 级数据从 Azure 存储中导入或导出。通过硬件传输设备可加速数据的安全传输&#xff0…

Mybtais高级结果映射-多对一表映射

前言 从前我们只进行单表的sql操作,但是如果涉及多张表的操作,原先的映射关系就不太适用了,因此这里将会介绍Mybatis的高级结果映射技巧 准备工作 准备两张数据库表,一个员工表,一个部门表(我们使用oracle的…

彻底理解前端模块化

目录 引入历史问题 CommonJSexports导出module.exports导出require导入加载过程缺点 AMD规范(基本不用)require.js使⽤ CMD规范(基本不用)SeaJS的使⽤ ES Module简单使用export关键字import关键字export和import结合default⽤法im…

自然语言处理在人工智能领域的发展历程,以及NLP重点模型介绍

大家好,我是微学AI,今天给大家介绍一下自然语言处理在人工智能领域的发展历程,以及NLP重点模型介绍。本文详细介绍了自然语言处理的发展历程,同时深入探讨了各种自然语言处理模型的原理与应用。文章首先回顾了自然语言处理技术的发…

读论文《OmniGen: Unified Image Generation》

OmniGen演示了在单一框架内执行各种图像生成任务的能力。此外,它还具有推理能力和语境学习能力。 论文地址:2409.11340v1 (arxiv.org) 项目地址:GitHub - VectorSpaceLab/OmniGen 项目目前还不完整,论文展现的通用性十分强大&am…

【Java】Java中接口与内部类详解

目录 引言 一、接口(Interface) 1.1 接口的定义 1.1.1 接口的特点 1.2 接口的实现 1.3 接口的继承 1.4 接口的注意事项 1.5 代码示例 二、内部类(Inner Class) 2.1 内部类特点 2.2 成员内部类 2.2.1 对象的创建 2.…

基于SpringBoot社区疫情信息管理系统的设计和实现

文未可获取一份本项目的java源码和数据库参考。 选题的意义 保护好人民群众的基本安全,贯彻党的领导下中国一盘棋的基本准则。将病毒隔绝在外,信息系统的存在显得至关重要,应对新型冠状病毒肺炎疫情治理的实践背景。实时关注更新疫情动态&a…

开放式耳机哪个牌子的质量好?2024开放式蓝牙耳机排行榜前5强推荐!

​开放式耳机因其舒适的佩戴感和较小的耳朵损伤而广受好评。曾经让人头疼的漏音问题,随着科技的进步,已经有了显著改善,不再是个大问题。在拥挤的环境中,耳机音量过大不仅会打扰他人,也会让自己感到不适。因此&#xf…

双十一买什么?高性价比数码好物来袭,不心动都难!

​每年的双十一都是一场购物的狂欢盛宴,众多数码好物纷纷推出诱人的折扣。在这琳琅满目的数码产品中,电容笔无疑是一颗格外耀眼的 “星”。无论是学生党用于记录课堂笔记、撰写论文,还是绘画爱好者进行艺术创作、灵感挥洒,电容笔都…

linux -L16-linux 查看应用占用的资源top

linux 查看应用占用的资源top Targetsteps启动 top 命令排序进程:查看特定进程:过滤进程其他常用选项交互式帮助 Target linux 查看应用占用的资源top steps 在 Linux 系统中,top 命令是一个非常有用的工具,它提供了一个实时更…

springframework Ordered接口学习

Ordered接口介绍 完整路径: org.springframework.core.Ordered Ordered 接口是 Spring 框架中的一个核心接口,用于定义对象的顺序。这个接口通常用于需要排序的组件,例如 Spring 中的 Bean、过滤器(Filters)、拦截器…

SUSCTF2024-Redroid-出题笔记与解题思路

SUSCTF2024-Redroid-出题笔记与解题思路 Step1Step2Step3Step4 描述:题目要求使用安卓13/14系统真机 Step1 Java层的逻辑比较简单,两个Activity MainActivity读并验证password,正确即进入CheckActivity,同时会传递password pass…