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

文章目录

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

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

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

  • 代理将原本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):是各个相互交互的对象,它们之间不直接通信,而是通过中介者来进行通信。每个同事对象都持有对中介者对象的引用,以便在需要时与中介者进行通信。

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

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

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

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

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

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

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

相关文章

Java面试八股之marshalling和demarshalling

marshalling和demarshalling Marshalling(序列化)是将内存中的对象状态转化为适合传输或存储的格式(如字节流、JSON、XML),以便进行网络通信、持久化存储或跨平台/语言交互操作。Demarshalling(反序列化&a…

spring aop介绍

Spring AOP(面向切面编程)是一种编程范式,它允许开发者将横切关注点(cross-cutting concerns)从业务逻辑中分离出来,从而提高代码的模块化。在传统的对象导向编程中,这些横切关注点,…

【分治】Leetcode 颜色分类

题目讲解 75. 颜色分类 这道题的本质就是数组分三块 算法讲解 使用三个指针,i遍历数组,left标记0的最右侧,right标记2的最左侧 如果当前的nums[i] 0,我们就让nums[left] 和 nums[i]位置上的数字做交换,这里的i是可以向前移…

基于51单片机的宠物自动喂食语音播报,有实物

1. 51仿真: LCD第一屏显示食物重量,当前时间,温湿度。第二屏显示喂食时间,第三屏显示喂食重量。可通过点击查看喂食时间翻转屏幕显示。 点击查看喂食时间后,显示喂食时间,可以设置三个时间,再点…

【做一名健康的CSDNer】程序员哪几种行为最伤肾(程序员必看)

虽然没有专门针对程序员这一职业群体特有的伤肾行为的研究报道,但根据一般人群的健康风险和生活习惯,程序员由于其特殊的工作模式和环境,可能更容易出现如下伤肾的行为: 熬夜加班: 程序员由于项目进度、bug修复等原因&…

面试十八、容器适配器

容器适配器是一种特殊类型的容器,它们提供了一种不同于常规容器的接口和行为。容器适配器通常是建立在其他容器之上,通过改变接口或添加限制来满足特定的需求或解决特定的问题。 在 C 中,标准库提供了三种常见的容器适配器: 栈&am…

《HCIP-openEuler实验指导手册》1.3Apache动态功能模块加载卸载练习

1.3.1 配置思路 mod_status 模块可以帮助管理员通过web界面监控Apache运行状态,通过LoadModule指令加载该模块,再配置相关权限,并开启ExtendedStatus后,即可使用该模块。 1.3.2 配置步骤 检查mod_status模块状态(使…

用户成功故事汇源达投顾选股软件见证智 慧投资的辉煌篇章

在投资领域,每一个成功的投资者背后,往往都有一款值得信赖的选股软件作为他们的得力助手。而河北源达的“财源滚滚”选股软件,正是这样一款备受投资者赞誉的智能投资工具。今天,我们就来分享一些使用财源滚滚选股软件获得成功的用…

【数学建模】虫子追击问题(仿真)

已知 有四个虫子,分别是 A , B , C , D A,B,C,D A,B,C,D A , B , C , D A,B,C,D A,B,C,D分别在 ( 0 , 0 ) , ( 0 , 1 ) , ( 1 , 1 ) , ( 1 , 0 ) (0,0),(0,1),(1,1),(1,0) (0,0),(0,1),(1,1),(1,0)四个虫子A追B,B追C,C追D,D追A四个速度相同 …

【UnityShader】图片圆角

1.需求 我们在开发的时候,有时候一些按钮或者菜单栏的边角是直角的需要改成圆角,但是让美术重新绘制耽误时间不说也确实没必要,这个时候我们不妨使用一个简单的shader去解决这个问题,下面我们就讲讲这个shader要如何实现。 需求1…

【智能算法】闪电搜索算法(LSA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2015年,H Shareef等人闪电自然现象启发,提出了闪电搜索算法(Lightning Search Algorithm, LSA)。 2.算法原理 2.1算法思想 LSA受到闪电梯级先导传…

c++取经之路(其七)——c++的内存管理new与delete

c的基本的内存管理一般就是用new和delete来管理 new与delete: 我们直接来将用法,我一般用new有两种用法,一种只申请一个这样的数据,另一种是申请多个这样的数据,比如我们要申请一个int,和申请十个int&…

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

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

Linux实现标准输入和标准输出(STDIN_FILENO和STDOUT_FILENO)

在C语言中&#xff0c;scanf和printf函数用于标准输入和标准输出的输入输出操作。而在Linux中&#xff0c;STDIN_FILENO和STDOUT_FILENO是用于表示标准输入和标准输出的文件描述符。 STDIN_FILENO和STDOUT_FILENO是定义在头文件 <unistd.h> 中的常量&#xff0c;用于表示…

【C语言进阶】指针例题大杂烩,阁下是高手还是菜鸟?

前言 首先说明&#xff0c;本文不适合新手&#xff0c;如果你刚刚接触指针&#xff0c;可以看看前五点&#xff0c;这是我认为指针中比较重要的细节&#xff0c;例题部分酌情尝试。 如果你自认为指针学的不错&#xff0c;胸有成竹&#xff0c;请尝试最后的例题&#xff0c;如…

空间转录组SODB数据库(补充)

SODB数据库 SODB facilitates comprehensive exploration of spatial omics data | Nature Methods https://db.cngb.org/stomics/ a–f&#xff0c; SODB的整体设计。六个六边形总结了SODB的六个特点。SODB包含各种类型的空间组学数据&#xff08;a&#xff09;&#xff0c…

C++心决之类和对象详解(中篇)(封装入门二阶)

目录 1.类的6个默认成员函数 2. 构造函数 2.1 概念 2.2 特性 3.析构函数 3.1 概念 3.2 特性 4. 拷贝构造函数 4.1 概念 4.2 特征 5.赋值运算符重载 5.1 运算符重载 5.2 赋值运算符重载 5.3 前置和后置重载 7.const成员 8.取地址及const取地址操作符重载 1.类的…

Linux 目录遍历函数

目录遍历函数 DIR *opendir(const char *name); struct dirent *readdir(DIR *dirp); int closedir(DIR *dirp);// 打开一个目录 #include <sys/types.h> #include <dirent.h> DIR *opendir(const char *name);参数&#xff1a;- name: 需要打开的目录的名称返回值…

Spring AI教程(二)Chat API之基于数据库的多Key轮询

基于数据库的多Key轮询 在之前的文章中我们所使用的Key都是一个&#xff0c;但事实上&#xff0c;官方对Key会有一定的请求限制&#xff0c;在实际业务场景下&#xff0c;我们也不可能通过一个Key来保证我们的系统稳定运行&#xff0c;因为一旦超过请求限制&#xff0c;就会出现…

Laravel + ThinkPhP 海报生成

相关资料: 小程序 | EasyWeChat 二维码生成 public function test(){$config [app_id > appid,secret > secret,];$app Factory::miniProgram($config);$response $app->app_code->get(pages/index/index, [//二维码大小width > 150,//二维码颜色line_color…