软件设计模式与体系结构-设计模式-行为型软件设计模式-中介者模式

news2024/9/20 9:02:06

三、中介者模式(迪米特法则)

概念

模式动机:
为了减少对象两之间复杂的引用关系,使之成为一个松耦合的系统,需要适用中介者模式

定义:
用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使耦合松散,而且可以独立地该变它们之间的交互

中介者模式又称为调停者模式,它是一种对象行为型模式
中介者模式的要点是将所有对象之间的交互细节抽象到一个独立的类中,这个类叫做中介者类Mediator
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

类图

在这里插入图片描述

代码

中介者模式(Mediator Pattern)是一种软件设计模式,它通过将对象之间的交互行为封装在一个中介者对象中,来实现对象之间的解耦。中介者模式促进了对象之间的松耦合,使其更易于维护和扩展。

下面是一个简单的中介者模式的代码示例,以说明其工作原理:

class Mediator:
    def __init__(self):
        self.component1 = Component1(self)
        self.component2 = Component2(self)

    def notify(self, sender, event):
        if event == 'event1':
            self.component2.do_something()
        elif event == 'event2':
            self.component1.do_something()

class Component1:
    def __init__(self, mediator):
        self.mediator = mediator

    def do_something(self):
        # 处理自己的逻辑
        print("Component 1 does something.")
        # 触发事件通知中介者
        self.mediator.notify(self, 'event1')

class Component2:
    def __init__(self, mediator):
        self.mediator = mediator

    def do_something(self):
        # 处理自己的逻辑
        print("Component 2 does something.")
        # 触发事件通知中介者
        self.mediator.notify(self, 'event2')

# 创建中介者对象
mediator = Mediator()

# 执行操作
component1 = Component1(mediator)
component2 = Component2(mediator)
component1.do_something()

在上述代码示例中,我们有一个中介者类 Mediator 和两个组件类 Component1Component2。中介者类拥有对这两个组件的引用,并提供了一个 notify 方法用于接收事件通知并根据不同的事件执行相应的操作。

当组件 Component1 执行 do_something 方法时,它会触发事件通知中介者,中介者根据事件类型调用 Component2 的相应方法。同样地,当组件 Component2 执行 do_something 方法时,它也会触发事件通知中介者,中介者根据事件类型调用 Component1 的相应方法。

这样,组件之间的交互行为通过中介者对象进行了封装,组件之间的耦合度降低,它们只需要与中介者进行通信,而不需要直接相互交互。这种解耦有助于增强代码的可维护性和扩展性。

中介者模式在现实世界中有许多应用,比如聊天室、航空交通管制系统等,它们都使用中介者来协调不同对象之间的交互行为,从而实现更好的系统设计。

中介者承担两方面的职责

中转作用(结构性):

通过中介者提供的中转作用各个同事对象就不再需要显式引用其他同事,当需要和其他同事进行通信时,通过中介者即可。
中转作用属于中介者在结构上的支持

协调作用(行为性):

中介者可以更进一步的对同事之间的关系进行封装,同事可以一致地和中介者进行交互,而不需要指明中介者需要具体怎么做,中介者根据封装在自身内部的协调逻辑,对同事的请求进行进一步处理,将同事成员之间的关系行为进行分离和封装。
协调作用属于中介者在行为上的支持

实例一:旅游项目信息共享软件的设计

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

实例二:海岛微型飞机场

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

优缺点

优点:
在这里插入图片描述

缺点:

在具体中介者类中包含了同事之间的交互细节可能会导致具体中介者类非常复杂,使得系统难以维护

适用场合

  1. 系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解。
  2. 一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象
  3. 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。可以通过引入中介者类来实现,在中介者中定义对象交互的公共行为,如果需要改变行为则可以增加新的中介者类

中介者模式与迪米特法则

在中介者模式中,通过创造出一个中介者对象,将系统中有关的对象所引用的其他对象数目减少到最少,使得一个对象与其同事之间的相互作用被这个对象与中介者对象之间的相互作用所取代。因此,中介者模式就是迪米特法则的一个典型应用。

课程作业

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

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

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

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

相关文章

从0开始,手写Redis

说在前面 从0开始,手写一个Redis的学习价值在于: 可以深入地理解Redis的内部机制和原理,Redis可谓是面试的绝对重点和难点从而更好地掌握Redis的使用和优化帮助你提高编程能力和解决问题的能力手写一个Redis可以作为一个优质的简历轮子项目…

LVS和keepalived群集

LVS和keepalived群集 一、keepalived概述:1.keepalived服务的重要功能:2.高可用故障切换转移原理:3.keepalived实现原理剖析:4.keepalived体系主要模块及作用:5.keepalived的工作原理: 二、部署LVS和keepal…

Android JetPack深入分析DataBinding源码

前言 数据绑定库是一种支持库,借助该库,您可以使用声明性格式(而非程序化地)将布局中的界面组件绑定到应用中的数据源。 DataBinding支持双向绑定,数据变化的时候界面跟着变化,界面变化也同步给数据&…

华为6605AC控制器大型组网wlan pool技术应用(自动漫游)

AC命令行配置: dis current-configuration set memory-usage threshold 0 ssl renegotiation-rate 1 vlan batch 100 vlan pool vlan_pool_test vlan 11 to 12 diffserv domain default radius-server template default free-rule-template name default_free_rule …

win10通过conda安装pytorch gpu

1. 安装anaconda 到官网下载最新版的anaconda,下载对应的windows版本,地址:anaconda官网 下载后直接安装,安装完成后配置环境变量,具体可以百度anaconda安装说明。安装完成后,打开cmd,输入conda…

Leetcode - 352周赛详解

一,最长奇偶子数组 看题可知可以使用暴力求解,从头开始遍历数组,另设一个变量来记录满足条件的子数组长度的最大值,将该变量不断与新得到的子数组长度比较,最终得到子数组长度的最大值。但是这样依次遍历的话&#xff…

git 分支管理

目录 一. 理解分支 1. master分支 二. 分支的(创建,切换、合并、删除) 1.查看分支 2.创建分支 3. 切换分支 4. 合并分支 5. 删除分支 三. 合并冲突 四. 合并模式 五. bug 分支 六. 强制删除分支 一. 理解分支 1. master分支 在我们的…

省电,AMD 提交 Linux 新技术 FreeSync Panel Replay

导读AMD 近日发布了一系列补丁,为其 AMDGPU Linux 内核显卡驱动程序的显示代码 “DC” 添加了一个新功能:FreeSync Panel Replay。这个功能针对搭载 DCN v3.1.4 显示块或更新版本的 AMD Ryzen 笔记本电脑,可以在屏幕内容不变时降低功耗。 目…

关于https的加密流程简介(图解)

目录 对称加密: 非对称加密 对称加密: 在网络发展的初阶,为了保护数据安全,防止黑客攻击,我们发明了对称加密 即一把秘钥,客户端和服务器通过这把钥匙对数据进行加密/解密 理想情况下,只要没…

第163天:应急响应-后门攻击检测指南Rookit内存马权限维持WINLinux

知识点 #知识点 -网页篡改与后门攻击防范应对指南 主要需了解:异常特征,处置流程,分析报告等 主要需了解:日志存储,Webshell检测,分析思路等 掌握: 中间件日志存储,日志格式内容介绍…

Qt之QMainWindow 自定义标题栏

简述 Qt自带标题栏功能还是很强大的,但是确实不能百分百满足需求,除了丑以外还不能随意更改标题栏字体,也不能更改样式;所以为了满足自己的虚荣心让标题栏变得更加好用看好看,特地花时间做了以下测试; 支持…

MySQL:数据的增删改查

数据的增删改查 前言一、插入数据1、实际问题2、方式1:VALUES的方式添加3、方式2:将查询结果插入到表中 二、删除数据三、更新数据四、查询数据五、MySQL8新特性:计算列 前言 本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知…

Dubbo sentinel 哨兵 熔断 慢调用比例、异常比例、异常数

目录 熔断报这个错误 在调用程序中检测即可 页面配置熔断,配置在 consumer 消费端 慢调用比例规则 最大rt 比例阈值 熔断时长 最小请求数 统计时长 让流量一直降低发送 异常数量 设置30个异常数 Tps 异常数量未达到30个正常运行 设置1个效果直接连续…

git bash 命令行反应慢、卡顿

1. 在Windows11的电脑上安装了git 后,鼠标右键打开git bash here,打开窗口缓慢,输入命令也慢的要死,如果安装git的时候选择在桌面创建图标,通过桌面图标打开也是一样的 2. 最简单的ls 命令,都要停顿半秒 3.…

Spring Security OAuth2.0(4):Spring Security集成SpringBoot

文章目录 前言一、创建工程二、spring容器配置三、Servlet Context配置四、安全配置五、创建测试七、启动服务器测试 前言 \qquad Spring Boot 是一套Spring的快速开发框架,基于Spring4.0设计,使用Spring Boot开发可以避免一些繁琐的工程搭建和配置&…

d3dx9_43.dll丢失怎么解决

d3dx9_43.dll丢失的影响 当我们在运行某些需要DirectX 9支持的程序时,如果系统中缺少d3dx9_43.dll文件,就会出现错误提示,导致程序无法正常启动。这个错误提示通常会类似于“找不到d3dx9_43.dll”或“d3dx9_43.dll不存在”。 打开电脑浏览器…

剑指 Offer 37: 序列化二叉树

这道题很复杂,首先需要发现是层序遍历,因为只有层序遍历才是这个顺序,并且new就可以调用,说明这里里面就生成了一个新的String(可以new一个String),给StringBuilder初始化一个],然后…

力扣题库刷题笔记31--下一个排列

1、题目如下: 2、个人Python代码实现如下: 前几次提交错误,主要是在上面截图第19行代码,原先写的是Nums nums[:i] temp,然后本地一直能跑过,这里不做多赘述 3、个人Python代码思路: 首先来讲本…

使用springboot框架Java+vue2开发的智慧班牌系统源码,SaaS云平台前后端分离架构

智慧班牌系统可实现数字化办公,对外向学生家长提供各种服务,如:消息通知、请假管理,校园活动,学生动态,教师通讯录,学生定位等各种服务。对内向教师提供各类服务,如:班级…

SpringMVC-1

学习笔记: SpringMVC 框架 Spring Web MVC 是一种基于 Java 实现了 MVC 设计模式的请求驱动型的轻量级 Web 框架,即使用了 MVC 架构模式的思想,将 web 层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的…