面向对象设计与分析40讲(25)中介模式、代理模式、门面模式、桥接模式、适配器模式

news2024/12/23 9:11:01

文章目录

    • 门面模式
    • 代理模式
    • 中介模式

之所以把这几个模式放到一起写,是因为它们的界限比较模糊,结构上没有明显的差别,差别只是语义上。

这几种模式在结构上都类似:

  • 代理将原本A–>C的直接调用变成:
    A–>B–>C

  • 适配器将原本A–>C的直接调用变成:
    A–>B–>C

  • 桥接将原本A–>C的直接调用变成:
    A–>A’–>C

  • 门面将原本A–>C、A–>D…的一堆调用变成:
    A–>(CD)的调用

  • 中介略有区别,将原本 A、B、C的网状模型:

     A
    /  \
   B -- C

变成星型模型:

        A
        |
   B -- D  -- C

门面模式

在这里插入图片描述
在这里插入图片描述

门面模式(Facade Pattern)是一种结构型设计模式,旨在提供一个统一的接口(界面),以简化一组复杂系统的使用。该模式为客户端提供一个高级接口,隐藏了系统内部子系统的复杂性,使得客户端只需与门面对象交互,而无需了解底层子系统的实现细节。也叫外观模式。

在门面模式中,通常包含以下几个角色:

  1. 门面(Facade):提供了一个简化的接口,将客户端的请求委派给底层的一个或多个子系统,通过门面对象可以访问底层子系统的功能。

  2. 子系统(Subsystems):实现了系统的各个功能,但对客户端隐藏了具体的实现细节。客户端可以通过门面对象间接地访问这些子系统。

门面模式的主要优点包括:

  • 简化接口:通过门面对象提供简单的接口,隐藏了复杂系统的实现细节,使得客户端更容易使用系统。

  • 解耦:将客户端与底层子系统解耦,客户端只需与门面对象交互,而不需要了解底层子系统之间的关系。

  • 更好的封装性:通过门面对象封装了底层子系统,使得系统更容易维护和扩展。

门面模式通常适用于以下情况:

  • 当系统的许多功能需要以简单的方式提供给客户端时。
  • 当需要对一个复杂系统进行简化,并且需要将其功能封装起来,以便提供一个更容易使用的接口时。
  • 当需要将系统与其客户端之间解耦,以便系统的变化不会影响到客户端时。

代理模式

在这里插入图片描述
在代理模式中,代理对象充当了被访问对象的替身,客户端通过代理对象间接地访问和操作被代理的对象,而不需要直接访问被代理对象。

代理模式通常涉及以下几种角色:

  • 抽象主题(Subject):定义了被代理对象和代理对象之间的公共接口,这样在任何使用被代理对象的地方都可以使用代理对象替代。

  • 真实主题(Real Subject):是被代理的对象,定义了代理对象所代表的真实对象。

  • 代理(Proxy):持有对真实主题的引用,并提供与真实主题相同的接口,以便在任何时候都可以替代真实主题。代理对象通常在访问真实主题之前或之后执行一些额外的操作,如权限验证、缓存、延迟加载等。

中介模式

在这里插入图片描述

中介模式(Mediator Pattern)是一种行为型设计模式,它用于降低多个对象之间的耦合度,通过引入一个中介者对象来协调对象之间的交互。在中介模式中,对象之间不直接相互通信,而是通过中介者对象进行通信,从而减少对象之间的直接依赖关系,提高系统的可扩展性。

中介模式通常涉及以下几种角色:

  1. 中介者(Mediator):定义了一个接口用于与各个同事对象通信,并维护了对各个同事对象的引用。中介者对象可以通过这些引用来了解各个同事对象的状态,并协调它们之间的交互。

  2. 同事对象(Colleague):是各个相互交互的对象,它们之间不直接通信,而是通过中介者来进行通信。每个同事对象都持有对中介者对象的引用,以便在需要时与中介者进行通信。

中介模式的常见用途包括:

  • 解耦对象之间的关系:中介者模式可以降低对象之间的直接依赖关系,将对象之间的交互集中到中介者对象中,从而使得系统更易于维护和扩展。

  • 集中控制对象之间的交互:通过引入中介者对象,可以集中控制对象之间的交互逻辑,使得系统更加清晰和可控。

  • 减少子系统之间的通信复杂性:当系统中存在大量对象需要进行交互时,中介者模式可以有效地减少对象之间的直接通信,从而降低系统的通信复杂度。

中介模式适用于系统中存在多个对象之间需要进行复杂交互的情况,通过引入中介者对象来简化对象之间的交互过程,从而提高系统的灵活性和可维护性。

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

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

相关文章

探索RadSystems:低代码开发的新选择(二)

系列文章目录 探索RadSystems:低代码开发的新选择(一)🚪 文章目录 系列文章目录前言一、RadSystems Studio是什么?二、用户认证三、系统角色许可四、用户记录管理五、时间戳记录总结 前言 在数字化时代,低…

HoloLens2的Unity应用在电脑上发布成安装包,然后通过wifi安装到设备

一、VS工程中的鼠标右键 二、发布——>创建应用程序包 三、选择【旁加载】 四、选择签名方法: 五、选择和配置包 六、创建完毕 七、网络连接设备 八、登录设备 九、安装app

基于springboot实现的摄影跟拍预定管理系统

开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven…

OpenHarmony实战开发-合理选择条件渲染和显隐控制。

开发者可以通过条件渲染或显隐控制两种方式来实现组件在显示和隐藏间的切换。本文从两者原理机制的区别出发,对二者适用场景分别进行说明,实现相应适用场景的示例并给出性能对比数据。 原理机制 条件渲染 if/else条件渲染是ArkUI应用开发框架提供的渲…

实现Spring底层机制(阶段1—编写自己的Spring容器,扫描包,得到bean的Class对象)

环境搭建抛出问题 1.环境搭建 1.创建maven项目 2.导入依赖 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.ap…

RK3568 学习笔记 : u-boot 通过 tftp 网络更新 u-boot自身

前言 开发板型号&#xff1a; 【正点原子】 的 RK3568 开发板 AtomPi-CA1 使用 虚拟机 ubuntu 20.04 收到单独 编译 RK3568 u-boot 使用 rockchip Linux 内核的设备树 【替换】 u-boot 下的 rk3568 开发板设备树文件&#xff0c;解决 u-boot 下千兆网卡设备能识别但是无法 Pi…

MQTT服务器EMQX的安装和使用(Windows)

一、下载地址&#xff1a; 下载 EMQX 二、安装环境&#xff1a; Windows Server2016 16G 500G 三、启动服务&#xff1a; 下载文件解压后放入以下目录&#xff08;注意&#xff0c;目录名一定是英文&#xff0c;否则会造成启动不成功&#xff01;&#xff09;&#xff1a…

Linux部署Coturn以及关于打洞的思考

目录 Coturn介绍部署架构图 2.1 局域网——无NAT映射 2.2 NAT网Corturn安装步骤验证 4.1 局域网——无NAT映射 4.2 NAT网 4.2.1 Cywin安装步骤 4.2.2 Coturn安装步骤 4.2.3 验证引言 下文部署架构图为Corturn为解决互联网NAT环境下“找朋友”的部署架构,也是Coturn发挥其价值…

C# 给图片添加文字水印

目录 应用场景 开发运行环境 方法说明 方法代码 调用示例 小结 应用场景 在某些应用项目&#xff08;如电子档案信息管理&#xff09;中&#xff0c;查看电子图片信息是经常使用到的功能&#xff0c;此时我们就需要给显示在浏览器中的图片添加文字水印版权或提示信息。…

Oracle EBS Interface/API(54)- GL日记账审批

背景: 客户化创建薪酬凭证或者银企付款入账日记账以后,用户希望自动提交审批流程,无需到系统标准功能点击审批,减少用户操作。 快速参考 参考点内容功能导航N: GL->日记账->输入并发请求None基表GL.GL_JE_BATCHESAPI参考下面介绍错误信息表None接口FormNone接口Reque…

PLSQL数据库

目录 什么是PLSQL数据库 PL数据库的实现方法 PL数据库的基本语法 1.作用 2.语法 3.赋值输出 4.引用 5.异常处理 6.if 判断 7.loop循环 8.while循环 9.for循环 10.游标 11.参数游标 12.索引 13.分区表 什么是PLSQL数据库 PL/SQL&#xff08;Procedure Language/…

mysql虚拟列问题

1&#xff0c;虚拟列的用途 1.1&#xff0c;虚拟列可以在创建表时定义&#xff0c;并在查询时像普通列一样使用&#xff1b;方便查询数据&#xff1b;比如从复杂的列数据中&#xff0c;解析taskID&#xff0c;使用虚拟列就很方便&#xff1b; 1.2&#xff0c;mapvalue是txt类…

查理·芒格的 100 个思维模型是什么?一文弄懂多元思维模型!

查理芒格&#xff0c;全名查尔斯托马斯芒格&#xff0c;是一位美国投资者、商业人士以及慈善家。他最为人所知的身份是作为伯克希尔哈撒韦公司的副主席&#xff0c;与投资大师沃伦巴菲特共同塑造了该公司的投资风格和成功。芒格以其深厚的智慧、跨学科的思考方式和独到的价值投…

vivado 使用波形 ILA 触发器和导出功能

使用波形 ILA 触发器和导出功能 • 启用自动重新触发 &#xff1a; 选中“ Waveform ”窗口工具栏上的“启用自动重新触发 (Enable Auto Re-Trigger) ”按钮即可在 成功完成触发 上传 显示操作后 &#xff0c; 启用 Vivado IDE 以自动重新装备与“ Waveform ”窗口触发器…

自动化软件测试用例,自动化测试用例设计

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

书生·浦语大模型第二期实战营(5)笔记

大模型部署简介 难点 大模型部署的方法 LMDeploy 实践 安装 studio-conda -t lmdeploy -o pytorch-2.1.2conda activate lmdeploypip install lmdeploy[all]0.3.0模型 ls /root/share/new_models/Shanghai_AI_Laboratory/ln -s /root/share/new_models/Shanghai_AI_Laborato…

浏览器不兼容的问题和通用解决方案

大家好&#xff0c;我是咕噜铁蛋&#xff0c;今天我想和大家聊聊一个在我们日常上网过程中经常遇到的问题——浏览器不兼容。这个问题看似微小&#xff0c;但却常常让我们在浏览网页、使用在线应用时感到困扰。接下来&#xff0c;我将详细分析浏览器不兼容的原因&#xff0c;并…

【雪天鱼】Vitis HLS 学习笔记(1) Pipelining 流水线

文章目录 1 自媒体账号2 Pipelining 流水线2.1 只对最内层的 LOOP_J 循环进行 pipeline2.2 对最外层的 LOOP_I 循环进行 pipeline2.3 对函数 loop_pipeline 进行 pipeline&#xff0c;并对数组A进行分组2.4 思考 1 自媒体账号 目前运营的自媒体账号如下&#xff1a; 哔哩哔哩…

【uniapp】【uview2.0】【u-sticky】Sticky 吸顶

把pages.json文件中的 “navigationStyle"设置为"custom”, 出现的问题是&#xff0c;莫名奇妙多了个 一个高度 解决方法 /* 使用CSS的sticky定位 */ .sticky {/* #ifdef H5 */ position: -webkit-sticky;position: sticky;top: 0; /* 设置距顶部的距离 */z-ind…

《王者荣耀》Hello Kitty 小兵皮肤完整设置指南

王者荣耀与三丽鸥的联动活动上线了 Hello Kitty 小兵皮肤&#xff0c;让我们的峡谷小兵们也能穿上漂亮的衣服啦&#xff01;这款皮肤极具卡哇伊风格&#xff0c;引起了许多玩家的关注。许多小伙伴都想知道如何使用这款 Hello Kitty 小兵皮肤&#xff0c;今天小编将为大家整理出…