Facade 外观

news2024/11/30 2:32:41

意图

为子系统中的一组接口提供一个一致的界面,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() 方法来执行所有子系统的操作。

优点:

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

缺点:

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

总结:

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

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

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

相关文章

Ai2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 Adobe illustrator,常被称为“AI”,是一种应用于出版、多媒体和在线图像的工业标准矢量插画的软件。作为一款非常好的矢量图形处理工具,该软件主要应用于印刷出版、海报书籍排版、专业插画、多…

大数据测试:构建Hadoop和Spark分布式HA运行环境

随着大数据技术的不断发展,Hadoop和Spark已成为处理大规模数据的热门框架。在生产环境中,高可用性(HA)是至关重要的,以确保数据处理和分析任务不受中断。本文将详细介绍如何构建 Hadoop和Spark分布式HA运行环境&#x…

HarmonyOS开发实例:【任务延时调度】

介绍 本示例使用[ohos.WorkSchedulerExtensionAbility] 、[ohos.net.http]、[ohos.notification] 、[ohos.bundle]、[ohos.fileio] 等接口,实现了设置后台任务、下载更新包 、保存更新包、发送通知 、安装更新包实现升级的功能。 效果预览 使用说明 安装本应用之…

30K上岸,转鸿蒙开发之后直接乱杀!!

互联网太卷了,熬过了2023才发现,2024更难熬!只因行业发展多年,人才过度饱和!那前端的出路在哪里?我推荐大家学【华为鸿蒙原生应用开发】新兴行业需求大,各大厂都在高薪抢人,然后前端…

数据的表示和运算—2

1.算术逻辑单元(ALU) 输入信号:A和B为要进行计算的两个操作数。(本质上就是高低电频电信号) 输出信号:输出运算结果 控制信号:由控制单元(CU)发出,解析指令的含义,解析完发出控制信号,M表示做什么运算,M1(逻辑运算) M0(算术运算) S0 ~ S3指明…

Vue3从入门到实战:深度掌握组件通信(下部曲)

5.组件通信方式5-$attrs $attrs的概念: 在Vue中,$attrs 是一个特殊的属性,用于访问父组件向子组件传递的非特定属性。它可以让子组件轻松地获取父组件传递的属性,而无需在子组件中显式声明这些属性。 想象一下你有一个父组件和…

vue3第二十节(新增编译宏defineModel)

为什么会需要使用defineModel() 注意:defineModel() 需要在3.4及以上版本才可使用; 组件之间通讯,通过 props 和 emits 进行通讯,是单向数据流,比如:props是自上而下的(父组件数据修改导致子组件更新&…

别找了,这35份Excel自动排班表真的好用!

别再自己做排班表了,调了半天不好看格式还不对。 看看自己需要的是哪些类型的排班表?是公司值班,还是直播排班,还是考勤汇总,总有一个适合你。 刚整理的35份办公常用的排班表,希望能帮到你! …

[lesson39]逗号操作符的分析

逗号操作符的分析 逗号操作符 逗号操作符(,)可以构成逗号表达式 逗号表达式用于将多个子表达式连接成为一个表达式逗号表达式的值为最后一个子表达式的值逗号表达式中的前N-1个子表达式可以没有返回值逗号表达式按照从左向右的顺序计算每个子表达式的值 重载逗号操作符 在C…

李廉洋:4.17晚间现货黄金,WTI原油美盘晚间操作及策略。

现在是否正在上演货币战,这对外汇和股票交易员意味着什么?在我看来这并不是一场货币战。实际情况是美元强势升值和亚洲货币普遍贬值,这其实是二阶段效应。由于美国通胀较预期更有粘性,经济数据也强于预期,美联储又变的…

monkey大全!可直接运用在项目中的常规monkey命令

测试步骤 adb devices-----了解包名-----adb shell monkey -----p 包名 ----v 运行次数(多个参数的组合形成不同的用例以求最大的覆盖)-----当崩溃或无响应时分析monkey日志 常规monkey命令 (可直接在项目里使用) adb shell m…

【计算机考研】目标学校改考408,报考人数大量减少,第二年能捡漏吗?

关键还是要看往年,最近三年的成绩。如果突然暴跌的话一定要注意第二年是否会弹很厉害。有时候408的学校就是一场博弈论,选择大于努力。 从大部分情况来看,爆冷后第一年回弹还是有限,但是第三年可能会爆热。 然后谈一下备考。 首…

信息系统项目管理师0053:设计和实施(4信息系统管理—4.1管理方法—4.1.3设计和实施)

点击查看专栏目录 文章目录 4.1.3设计和实施1.设计方法2.架构模式4.1.3设计和实施 开展信息系统设计和实施,首先需要将业务需求转换为信息系统架构,信息系统架构为将组织业务战略转换为信息系统的计划提供了蓝图。信息系统是支持组织中信息流动和处理的所有基础,包括硬件、软…

Seaborn:推荐一个好用的Python可视化工具

1. 引言 Seaborn 是建立在 matplotlib 基础上的数据可视化库,并与 Python 中的 pandas 数据结构紧密结合。可视化是 Seaborn 的核心部分,有助于直观的理解数据。 闲话少说,我们直接开始吧! 2. 安装 Seaborn库主要提供以下功能…

论文DOI号相关及在latex中添加DOI跳转

DOI与ISBN, ISSN的不同之处 图书和期刊内容都使用DOI。 与ISBN和ISSN不同的是,ISBN喝ISSN可以识别图书或期刊,DOI可以识别单个章节或单篇文章。 所以,如果要搜寻某本书籍,需要用到的是ISBN号;如果要搜寻某本期刊&…

微服务组件-注册中心

微服务组件-注册中心 使用restTemplate实现远程服务调用存在以下的问题: 1、消费者不知道如何获取服务提供者具体信息。 2、在远程调用的过程中,直接采用填写url的硬编码方式,如果服务消费者发生变化,得到的结果就会出错。 3、如果…

机器学习-随机森林算法预测房租模型

文章目录 机器学习-随机森林算法预测房租模型解决问题数据集探索性数据分析数据预处理构建模型并训练结果分析与评估参数调优结果预测经验总结参考文章 机器学习-随机森林算法预测房租模型 解决问题 根据待租房源相关信息,通过随机森林机器学习算法构件预测模型&a…

代码随想录算法训练营第二十九天|491.递增子序列、46.全排列、46.全排列II

491. 非递减子序列 思路: 在90.子集II (opens new window)中我们是通过排序,再加一个标记数组来达到去重的目的。 而本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。 所以不能使用之前的去重逻辑&…

C++_特殊类的设计和单例模式

文章目录 学习目标:1.请设计一个类,不能被拷贝2. 请设计一个类,只能在堆上创建对象3. 请设计一个类,只能在栈上创建对象4. 请设计一个类,不能被继承5. 请设计一个类,只能创建一个对象(单例模式) 特殊类的设…

Django中的数据库优化与ORM性能调优【第169篇—ORM性能调优】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Django中的数据库优化与ORM性能调优 在开发基于Django的Web应用程序时,数据库是…