设计模式-中介者模式

文章目录

  • 一、前言
  • 二、中介者模式
    • 1、定义
    • 2、未使用/使用中介者模式对比
      • 2.1、未使用中介者模式:
      • 2.2、使用中介者模式:
    • 3、角色分析
      • 3.1、中介者(Mediator):
      • 3.2、同事(Colleague):
      • 3.3、客户(Client):
    • 4、中介者模式案例分析
      • 4.1、中介者
      • 4.2、同事
      • 4.3、客户
    • 5、代码示例
  • 三、总结

一、前言

本文将详细介绍设计模式中的中介者模式,其中包括,中介者模式的优点、缺点、各组成部分。

二、中介者模式

在这里插入图片描述

1、定义

中介者模式(Mediator Pattern)是一种设计模式,它定义了一个中介者类,该类将多个对象之间的通信抽象化,使得这些对象可以通过中介者进行通信,从而降低它们之间的直接耦合度。中介者模式适用于多个对象之间存在复杂的交互关系,直接耦合会导致代码变得复杂、难以维护和扩展。

2、未使用/使用中介者模式对比

2.1、未使用中介者模式:

在没有使用中介者模式的情况下,多个对象之间可能存在直接的相互依赖,导致代码的耦合度较高。当一个对象需要与其他多个对象进行交互时,它可能需要了解这些对象的详细信息,并直接调用它们的方法,这会增加代码的复杂性和难以维护性。

2.2、使用中介者模式:

通过引入中介者模式,可以将多个对象之间的交互抽象化,降低它们之间的直接耦合度。中介者类负责协调和管理各个对象之间的通信,各个对象只需要关注自身的职责,而不必关心其他对象的实现细节。这有助于简化代码,提高可维护性和可扩展性。

在未使用中介者模式的情况下,系统的各个子系统之间直接相互依赖,子系统之间的方法可以直接相互调用。这样的系统耦合性较大,不利于系统的维护和理解。

而使用中介者模式后,子系统之间的依赖关系被打破,各个子系统都只与中介者发生依赖,而不直接与其他子系统发生依赖。这样可以将系统中各个子系统的关系解耦,降低系统的复杂性,简化系统设计和理解。同时,中介者模式的引入也可以方便系统扩展和维护,因为对于子系统的修改和增加,只需要修改或增加中介者相应的处理方法即可,不需要对其他子系统进行修改。

3、角色分析

3.1、中介者(Mediator):

中介者类负责协调和管理各个对象之间的通信。它通常包含一个或多个 Colleague 对象的引用,并提供了相应的方法来处理或转发请求。中介者类通常没有具体的业务逻辑,而是根据需要调用相应的 Colleague 对象的方法。

3.2、同事(Colleague):

同事类是与中介者类进行交互的各个对象。每个同事类通常包含一些特定的业务逻辑,并且可以通过中介者来与其他同事类进行通信。

3.3、客户(Client):

客户类是使用中介者模式的对象。它通常只需要与中介者类进行交互,而不需要直接与各个同事类进行交互。

4、中介者模式案例分析

以电商平台的订单管理系统为例,订单管理系统涉及多个角色,如订单、购物车、用户等。这些角色之间存在复杂的交互关系,例如用户添加商品到购物车后可以提交订单,购物车可以修改订单状态等。

4.1、中介者

订单管理系统可以作为一个中介者,负责协调和管理各个角色之间的通信。例如,当用户提交订单时,订单管理系统可以调用购物车和库存管理系统的相关方法来处理请求。

4.2、同事

购物车、库存管理系统、支付系统等可以作为同事类,它们具有各自的业务逻辑,并可以通过订单管理系统进行通信。例如,购物车可以修改订单状态,库存管理系统可以检查商品库存等。

4.3、客户

用户可以作为客户类,他们只需要与订单管理系统进行交互,而不需要直接与其他同事类进行交互。用户可以通过订单管理系统来查看订单状态、取消订单等。

通过引入中介者模式,可以将各个角色之间的交互抽象化,降低它们之间的直接耦合度。这有助于简化代码,提高可维护性和可扩展性。

5、代码示例

// 中介者接口  
interface OrderMediator {  void addItemToCart(String itemId, int quantity);  void submitOrder(String userId);  
}  // 购物车同事类  
class ShoppingCart implements Colleague {  private Map<String, Integer> items = new HashMap<>();  private OrderMediator mediator;  public ShoppingCart(OrderMediator mediator) {  this.mediator = mediator;  }  @Override  public void handle(String message) {  if (message.startsWith("add")) {  String[] parts = message.split("\\s+");  addItemToCart(parts[1], 1);  } else if (message.equals("submit")) {  submitOrder(getUserId());  }  }  private void addItemToCart(String itemId, int quantity) {  items.put(itemId, items.getOrDefault(itemId, 0) + quantity);  mediator.addItemToCart(itemId, quantity);  }  private void submitOrder(String userId) {  // TODO: 提交订单的逻辑实现  System.out.println("Order submitted by user: " + userId);  }  private String getUserId() {  // TODO: 获取用户ID的逻辑实现  return "User123";  }  
}  // 库存管理系统同事类  
class InventorySystem implements Colleague {  private Map<String, Integer> inventory = new HashMap<>();  private OrderMediator mediator;  public InventorySystem(OrderMediator mediator) {  this.mediator = mediator;  }  @Override  public void handle(String message) {  if (message.startsWith("check")) {  String[] parts = message.split("\\s+");  checkInventory(parts[1]);  }  }  private void checkInventory(String itemId) {  int quantity = inventory.getOrDefault(itemId, 0);  System.out.println("Inventory quantity for item " + itemId + ": " + quantity);  }  
}  // 订单管理系统中介者类  
class OrderMediatorImpl implements OrderMediator {  private Map<String, Colleague> colleagues = new HashMap<>();  @Override  public void addItemToCart(String itemId, int quantity) {  Colleague colleague = colleagues.get(itemId);  if (colleague != null) {  colleague.handle("add " + quantity);  } else {  System.out.println("Item not found in the cart");  }  }  @Override  public void submitOrder(String userId) {  Colleague colleague = new ShoppingCart(this);  colleagues.put(userId, colleague);  colleague.handle("submit");  }  
}
public class Main {  public static void main(String[] args) {  OrderMediator orderMediator = new OrderMediatorImpl();  Colleague shoppingCart = new ShoppingCart(orderMediator);  Colleague inventorySystem = new InventorySystem(orderMediator);  orderMediator.addItemToCart("item1", 2); // 将item1加入购物车,数量为2  orderMediator.submitOrder("User123"); // 提交订单,用户ID为User123  inventorySystem.handle("check item1"); // 检查item1的库存数量  }
}

三、总结

中介者模式是一种重要的设计模式,它通过引入中介者类来降低多个对象之间的直接耦合度,从而提高代码的可维护性和可扩展性。在具体应用中,我们需要根据实际需求选择合适的中介者实现方式,并在合适的场景中应用该模式。

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

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

相关文章

Python爬虫乱码问题之encoding和apparent_encoding的区别

encoding是从http中的header中的charset字段中提取的编码方式&#xff0c;若header中没有charset字段则默认为ISO-8859-1编码模式&#xff0c;则无法解析中文&#xff0c;这是乱码的原因 apparent_encoding会从网页的内容中分析网页编码的方式&#xff0c;所以apparent_encodi…

除法的效率 arm处理器

除法的效率 性能结论&#xff1a; 除法&#xff1a;545ms 乘法&#xff1a;93ms 差了3倍 代码&#xff1a; #define CNT (1000) #define factor (0.666667) // 乘法0.666667 &#xff0c;除法时 1/1.5 void parse3AState(Pack1* in, Pack2* out) {for (int i 0; i < CNT…

【消息中心】kafka消费失败重试10次的问题

Kafka消费失败重试10次的问题通常可以通过配置Kafka消费者来调整。在Kafka中&#xff0c;可以通过设置max.poll.interval.ms、fetch.min.bytes、fetch.max.bytes、fetch.max.wait.ms等参数来控制消费者的拉取消息的行为。 在Spring-Kafka中&#xff0c;消费失败的重试次数可以…

android frida 逆向 自吐加密算法

前言&#xff1a; ♛ frida hook android Android 逆向神器 前几天在学习 Android 逆向的时候发现了一个神器&#xff1a;通过 frida hook 我们可以 “劫持” 一些函数 为我们所用&#xff0c; 今天就和大家上手一个 加密函数的劫持 让打印出&#xff1a; 加密秘钥 …

开箱报告,Simulink Toolbox库模块使用指南(五)——S-Fuction模块(C MEX S-Function)

文章目录 前言 C MEX S-Function 算法原理 原始信号创建 编写S函数 仿真验证 Tips 分析和应用 总结 前言 见《开箱报告&#xff0c;Simulink Toolbox库模块使用指南&#xff08;一&#xff09;——powergui模块》 见《开箱报告&#xff0c;Simulink Toolbox库模块使用…

PhpStorm安装篇

PhpStorm安装篇: 下载地址 : 进入官网下PhpStorm: PHP IDE and Code Editor from JetBrains 下载完之后&#xff0c;安装包 安装目录建议不要放C盘&#xff0c;放其他盘&#xff0c;其他直接一直点 next &#xff0c;到结束 安装完&#xff0c;打开编辑器 注册账号并登录后…

Android投屏总结

#android手机投屏 ####导语 至于手机投屏的实现方法可谓五花八门&#xff0c;今天小袁就说下以开发人员的角度来说下当今手机的主流投屏方法。目前这种将终端信号经由WiFi传输到电视、电视盒的技术有三种&#xff1a;DLNA、AirPlay、Miracast、Google Cast。 ##手机投屏智能电…

python 深度学习 解决遇到的报错问题3

目录 一、AttributeError: The vocab attribute was removed from KeyedVector in Gensim 4.0.0. 二、ImportError: cannot import name logsumexp 三、FutureWarning: Passing (type, 1) or 1type as a synonym of type is deprecated; in a future version of numpy, it w…

VBA:对Excel单元格进行合并操作

Sub hb()Dim nn 3For i 3 To 18If Range("b" & i) <> Range("b" & i 1) ThenRange("b" & n & ":b" & i).Mergen i 1End IfNextEnd Sub

ubuntu 安装 指定版本:nodejs

通过 PPA 安装指定或最新版本的 nodejs 那么就需要使用 nodesource 来安装指定版本的 nodejs 了。其需要下载一个脚本&#xff0c;运行此脚本会在 ubuntu 里添加一个 nodejs 源&#xff0c;然后用 apt 就可以下载指定的 nodejs 了。 PPA 的全称为 personal package archive 。要…

PHP入门及环境搭建 - XAMPP

文章目录 PHP简介搭建PHP环境(XAMPP)下载XAMPP安装XAMPP第1步:双击setup_xampp.bat检测第2步:启动Apache和MySQL第3步:浏览器访问内置的启动页面readme文档 - 必读运行Hello World程序下载并安装Eclipse for PHP编写Hello World程序参考目标: 1、了解PHP语言 2、搭建PHP开…

记录--前端使用a链接下载内容增加loading效果

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 问题描述&#xff1a;最近工作中出现一个需求&#xff0c;纯前端下载 Excel 数据&#xff0c;并且有的下载内容很多&#xff0c;这时需要给下载增加一个 loading 效果。 代码如下&#xff1a; // util…

Maven入门教程(三):Maven语法

视频教程&#xff1a;Maven保姆级教程 Maven入门教程(一)&#xff1a;安装Maven环境 Maven入门教程(二)&#xff1a;idea/Eclipse使用Maven Maven入门教程(三)&#xff1a;Maven语法 Maven入门教程(四)&#xff1a;Nexus私服 Maven入门教程(五)&#xff1a;自定义脚手架 6.Mav…

Loki日志系统

1、Loki是什么&#xff1f; Loki是一个开源的日志聚合系统&#xff0c;由Grafana Labs开发和维护。它旨在帮助用户收集、存储和查询大规模的日志数据&#xff0c;帮助用户更好地理解和监控他们的应用程序和系统。 Loki的设计灵感来自于Prometheus&#xff0c;它采用了类似的标…

Unity中立体声平移的应用

实现的效果 若从左声道开始&#xff0c;播放效果逐渐从左声道过渡到右声道&#xff0c;再从右声道过渡到左声道&#xff0c;具体效果请戴上耳机播放下列视频。 StereoPanning 代码实现 public class AudioInfo {[HideInInspector] public float[] StereoTranslationValues;//立…

【小沐学Unity3d】3ds Max 骨骼动画制作(蒙皮修改器skin)

文章目录 1、简介2、蒙皮修改器3.1 骨骼对象测试3.2 Biped对象测试 3、动画制作4、FBX导出结语 1、简介 “蒙皮”修改器是一种骨骼变形工具&#xff0c;主要设计用于通过另一个对象对一个对象进行变形来创建角色动画。可使用骨骼、样条线和其他对象变形网格、面片和 NURBS 对象…

docker镜像是如何导入的?

镜像导入是由image/tarexport/load.go#tarexporter.Load()完成的 以下代码参考github.com/docker/docker版本v0.0.0-20181129155816-baab736a3649 主要是注册镜像信息以及解包镜像tar流到新root 导出和保存的区别在于 导出(export): 仅导出文件结构保存(save): 保存镜像历史和元…

python3+requests:接口自动化测试(二)

前言&#xff1a;上篇文章python3requestsunittest&#xff1a;接口自动化测试&#xff08;一&#xff09;&#xff1a;已经介绍了基于unittest框架的实现接口自动化&#xff0c;但是也存在一些问题&#xff0c;比如最明显的测试数据和业务没有区分开&#xff0c;接口用例不便于…

【机器学习】线性回归

Model Representation 1、问题描述2、表示说明3、数据绘图4、模型函数5、预测总结附录 1、问题描述 一套 1000 平方英尺 (sqft) 的房屋售价为300,000美元&#xff0c;一套 2000 平方英尺的房屋售价为500,000美元。这两点将构成我们的数据或训练集。面积单位为 1000 平方英尺&a…

2010-2021年上市公司和讯网社会责任评级CSR数据/和讯网上市公司社会责任数据

2010-2021年上市公司和讯网社会责任评级CSR数据 1、时间&#xff1a;2010-2021年 2、指标&#xff1a;股票名称、股票代码、年份、总得分、等级、股东责任、员工责任、供应商、客户和消费者权益责任、环境责任、社会责任、所属年份 3、样本量&#xff1a;4万 4、来源&#…