Facade 外观

意图

为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一字系统更加容易使用。

结构

其中:

Facade知道哪些子系统负责处理请求;将客户的请求代理给适当的子系统对象。

Subsystem classes实现子系统的功能;处理由Facade对象指派的任务;没有Facade的任何相关信息,即没有指向Facade的指针。

适用性

Facade模式使用于:

  • 要为一个复杂子系统提供一个简单接口时,子系统往往因为不断演化而变得越来越复杂。大多数模式使用时,都会产生更多更小的类,这使得子系统更具有可重用性,也更容易对子系统进行定制,但也给那些不需要定制子系统的用户带来一些使用上的困难。Facade可以提供一个简单的默认视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制的用户可以越过Facade层。
  • 客户程序与抽象类的实现部分之间存在着很大的依赖性。引入Facade将这个子系统与客户以及其他子系统分离,可以提高子系统的独立性和可移植性。
  • 当需要构建一个层次结构的子系统时,使用 Facade模式定义子系统中每层的入口点。如果系统之间是相互依赖的,则可以让它们仅通过Facade进行通信,从而简化了它们之间的依赖关系。

代码示例

假设需要创建一个应用程序来管理一个复杂的系统,该系统包含多个子系统,每个子系统都提供不同的功能。 为了简化与这些子系统的交互,可以使用外观模式创建一个统一的接口。

// 定义一个外观类,它将提供对所有子系统的统一访问
public class Facade {
    private SubSystem1 subSystem1;
    private SubSystem2 subSystem2;
    private SubSystem3 subSystem3;

    // 构造函数,初始化所有子系统
    public Facade(SubSystem1 subSystem1, SubSystem2 subSystem2, SubSystem3 subSystem3) {
        this.subSystem1 = subSystem1;
        this.subSystem2 = subSystem2;
        this.subSystem3 = subSystem3;
    }

    // 提供一个方法来执行所有子系统的操作
    public void performOperation() {
        subSystem1.operation1();
        subSystem2.operation2();
        subSystem3.operation3();
    }
}

// 定义一个子系统接口
interface SubSystem {
    void operation();
}

// 定义三个子系统类
class SubSystem1 implements SubSystem {
    @Override
    public void operation() {
        System.out.println("SubSystem1 operation");
    }
}

class SubSystem2 implements SubSystem {
    @Override
    public void operation() {
        System.out.println("SubSystem2 operation");
    }
}

class SubSystem3 implements SubSystem {
    @Override
    public void operation() {
        System.out.println("SubSystem3 operation");
    }
}

// 使用外观类
public class Main {
    public static void main(String[] args) {
        SubSystem1 subSystem1 = new SubSystem1();
        SubSystem2 subSystem2 = new SubSystem2();
        SubSystem3 subSystem3 = new SubSystem3();

        Facade facade = new Facade(subSystem1, subSystem2, subSystem3);
        facade.performOperation();
    }
}

代码设计注释:

  • Facade 类是外观类,它提供对所有子系统的统一访问。
  • SubSystem 接口定义了所有子系统都必须实现的操作。
  • SubSystem1SubSystem2SubSystem3 类是三个具体的子系统类,它们实现了 SubSystem 接口。
  • performOperation() 方法执行所有子系统的操作。
  • 在 Main 类中,我们创建了三个子系统对象,并使用它们创建了一个 Facade 对象。 然后,我们调用 Facade 对象的 performOperation() 方法来执行所有子系统的操作。

优点:

  • 外观模式简化了与复杂系统的交互。
  • 它将客户端代码与子系统代码解耦。
  • 它提高了代码的可维护性和可测试性。

缺点:

  • 外观模式可能会增加系统的复杂性。
  • 它可能会隐藏子系统之间的依赖关系。

总结:

外观模式是一种有用的设计模式,可以用来简化与复杂系统的交互。 它特别适用于需要对多个子系统提供统一访问的场景。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QGIS插件Geo-SAM使用(基于SAM半自动标注遥感图像)

0.Geo-SAM介绍 Geo-SAM是一个QGIS插件,旨在帮助人们在使用大尺寸地理空间栅格图像时有效地分割、描绘或标记地貌。Segment Anything Model (SAM) 是一个具有超能力的基础 AI 模型,但模型大小巨大,即使使用现代 GPU&am…

C++学习进阶版(一):用C++写简单的状态机实现

目录 一、基础知识 1、状态机 2、四大要素 3、描述方式 4、设计步骤 5、实现过程中需注意 (1) 状态定义 (2) 状态转换规则 (3) 输入处理 (4) 状态机的封装 (5…

Nginx第2篇-HTTPS配置教程

背景 我最近做个项目要上线,接口部署到服务器,总不能给别人个ip地址加端口吧,而且小程序上线要有接口不能是ip和http协议,必须是https协议。这里记录下使用Nginx配置HTTPS的过程,主要包含以下三部分。 申请域名SSL证…

远程预付费集抄管理系统

远程预付费集抄管理系统是一种用于能源(如水、电等)预付费管理的智能化系统,其核心在于提供远程集中抄表和费用管理服务。这种系统通过集成先进的远程监控技术和预付费管理功能,为用户提供了便捷的能源管理解决方案。下文将从核心功能、工作流程、优势特…

离世界模型更近一步!Meta开源OpenEQA,评估AI Agent情景理解能力

Yann LeCun 朝着 “世界模型” 又近了一步。 Meta最新的开源工作OpenEQA:从文字模型到世界模型,可以像人一样记忆、推理的新基准,AI理解物理空间又近了一步。 场景1: 假设你正准备离开家,但找不到你的工牌。 现在,…

5.2 iHRM人力资源 - 员工管理 - 使用文件导入导出员工

iHRM人力资源 - 员工管理 - 导入导出员工 文章目录 iHRM人力资源 - 员工管理 - 导入导出员工一、员工导出Excel二、员工导入Excel2.1 Excel导入组件封装2.2 下载导入模板2.3 Excel 导入功能 三、删除员工 一、员工导出Excel 这个地方涉及一个接口二进制流blob 就是下面这一大片…

使用嘉立创EDA打开JSON格式的PCB及原理图

一、将PCB和原理图放同一文件夹 并打包成.zip文件 二、打开嘉立创EDA并导入.zip文件 文件 -> 导入 -> 嘉立创EDA标准版/专业版 三、选择.zip文件并选择 “导入文件并提取库” 四、自定义工程路径 完成导入并转换为.eprj文件 五、视频教学 bilibili_使用立创EDA打开JSO…

香港科技大学广州|数据科学与分析学域硕博招生宣讲会—华东师范大学专场

时间:2024年4月25日(星期四)13:30 地点:华东师范大学普陀校区文附楼507 报名链接:https://www.wjx.top/vm/Q0cKTUI.aspx# 跨学科研究领域 *数据驱动的人工智能和机器学习 *统计学习和建模 工业和商业分析 *特定行业…

float实现文字环绕效果

实现效果如下: 一、问题分析 接到需求就是右侧显示图片,左侧显示一个标题和内容。第一时间没有想到其他的布局的好的实现方式,就想到了float布局。于是乎去查了下有关float的文档,float 是相当的好用。 float定义如下&#xf…

kibana源码编译

一、安装nodejs16.14.2及yarn (一)nodejs 1、下载 https://cdn.npmmirror.com/binaries/node/v16.14.2/node-v16.14.2-linux-x64.tar.gz2、解压 tar -zxf node-v16.14.2-linux-x64.tar.gz -C /app cd /app mv node-v16.14.2-linux-x64 node3、配置环…

在Linux系统中设定延迟任务

一、在系统中设定延迟任务要求如下: 要求: 在系统中建立easylee用户,设定其密码为easylee 延迟任务由root用户建立 要求在5小时后备份系统中的用户信息文件到/backup中 确保延迟任务是使用非交互模式建立 确保系统中只有root用户和easylee用户…

Matlab|基于改进遗传算法的配电网故障定位

目录 1 主要内容 2 部分代码 3 部分程序结果 4 下载链接 1 主要内容 该程序复现文章《基于改进遗传算法的配电网故障定位》,将改进的遗传算法应用于配电网故障定位中, 并引入分级处理思想, 利用配电网呈辐射状的特点, 首先把整个配电网划分为主干支路和若干独立…

2024年阿里云4核8G配置云服务器价格低性能高!

阿里云4核8G服务器租用优惠价格700元1年,配置为ECS通用算力型u1实例(ecs.u1-c1m2.xlarge)4核8G配置、1M到3M带宽可选、ESSD Entry系统盘20G到40G可选,CPU采用Intel(R) Xeon(R) Platinum处理器,阿里云优惠 aliyunfuwuqi…

【Python】高级进阶(专版提升3)

Python 1 程序结构1.1 模块 Module1.1.1 定义1.1.2 作用1.1.3 导入1.1.3.1 import1.1.3.2 from import 1.1.4 模块变量1.1.5 加载过程1.1.6 分类 1.2 包package1.2.1 定义1.2.2 作用1.2.3 导入1.1.3.1 import1.1.3.2 from import 2 异常处理Error2.1 异常2.2 处理 3 迭代3.1 可…

TinyEMU源码分析之访存处理

TinyEMU源码分析之访存处理 1 访存指令介绍2 指令译码3 地址转换3.1 VA与PA3.2 VA转PA 4 判断地址空间范围5 执行访存操作5.1 访问RAM内存5.2 访问非RAM(设备)内存 6 访存处理流程图 本文属于《 TinyEMU模拟器基础系列教程》之一,欢迎查看其…

数据结构排序算法

排序也称排序算法(SortAlgorithm),排序是将一组数据,依指定的顺序进行排列的过程。 分类 内部排序【使用内存】 指将需要处理的所有数据都加载到内部存储器中进行排序插入排序 直接插入排序希尔排序 选择排序 简单选择排序堆排序 交换排序 冒泡排序快速…

两阶段提交进阶

两阶段提交之进阶 上一节我们讲了,两阶段提交逻辑上的表现,其实较为肤浅,并且偏向理论,可能大家都能看懂,但是如果放入实际的mysql应用中并联系事务和日志进行分析,又会怎么样呢? 这次就专门分…

Unity类银河恶魔城学习记录13-1 p142 Save system源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili FileDataHandler.cs using System; using System.IO; using UnityEngine; p…

软考133-上午题-【软件工程】-软件项目估算

一、COCOMO 估算模型 COCOMO 模型是一种精确的、易于使用的成本估算模型。 COCOMO 模型按其详细程度分为:基本 COCOMO 模型、中级 COCOMO 模型和详细 COCOMO 模型。 1)基本 COCOMO 模型 基本 COCOMO 模型是一个静态单变量模型,用于对整个软…

内衣裤洗衣机如何选购?掌握这六个挑选技巧,轻松选购!

这两年内衣裤洗衣机可以称得上较火的小电器,小小的身躯却有大大的能力,一键可以同时启动洗、漂、脱三种全自动为一体化功能,在多功能和性能的提升上,还可以解放我们双手的同时将衣物给清洗干净,让越来越多小伙伴选择一…