【设计模式-中介者模式】

server/2024/12/22 16:39:06/

定义

中介者模式(Mediator Pattern)是一种行为设计模式通过引入一个中介者对象,来降低多个对象之间的直接交互,从而减少它们之间的耦合度。中介者充当不同对象之间的协调者,使得对象之间的通信变得简单且集中。

UML图

在这里插入图片描述

  • Mediator(中介者接口):定义中介者与同事之间的交互方法。
  • ConcreteMediator(具体中介者):实现中介者接口,维护对同事对象的引用,并协调它们之间的交互。
  • Colleague(同事抽象类):通常持有对中介者的引用,通过中介者进行通信。
  • ConcreteColleague(同事类):具体的组件类,通常持有对中介者的引用,通过中介者进行通信。

代码

// Mediator interface
interface Mediator {void send(String message, Colleague colleague);
}// Concrete Mediator
class ChatMediator implements Mediator {private List<Colleague> colleagues = new ArrayList<>();public void addColleague(Colleague colleague) {colleagues.add(colleague);}@Overridepublic void send(String message, Colleague colleague) {for (Colleague c : colleagues) {// Prevent sending message back to the senderif (c != colleague) {c.receive(message);}}}
}// Colleague interface
abstract class Colleague {protected Mediator mediator;public Colleague(Mediator mediator) {this.mediator = mediator;}public abstract void send(String message);public abstract void receive(String message);
}// Concrete Colleague
class User extends Colleague {private String name;public User(Mediator mediator, String name) {super(mediator);this.name = name;}@Overridepublic void send(String message) {System.out.println(name + ": Sending message: " + message);mediator.send(message, this);}@Overridepublic void receive(String message) {System.out.println(name + ": Received message: " + message);}
}// Client code
public class MediatorPatternDemo {public static void main(String[] args) {ChatMediator mediator = new ChatMediator();User user1 = new User(mediator, "Alice");User user2 = new User(mediator, "Bob");mediator.addColleague(user1);mediator.addColleague(user2);user1.send("Hello Bob!");user2.send("Hi Alice!");}
}

优点

  • 降低耦合性:同事对象不需要直接引用彼此,减少了依赖关系。
  • 集中管理:所有的交互逻辑集中在中介者中,易于维护和修改。
  • 灵活性:可以方便地添加新的同事类或修改交互逻辑,而不需要改变其他类。

缺点

  • 中介者复杂性:中介者可能会变得复杂,尤其是当它需要处理多个同事对象时。
  • 扩展困难:添加新的同事类可能需要对中介者进行修改,从而影响系统的灵活性。

使用场景

  • 当多个对象之间的通信需要被集中控制时。
  • 当系统中存在大量同事对象,且它们之间的交互复杂时。
  • 当希望减少类之间的依赖关系,提升系统的可维护性时。

http://www.ppmy.cn/server/126127.html

相关文章

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-30

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-30 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-30目录1. Proof Automation with Large Language Models概览&#xff1a;论文研究背景&#xff1a;技术挑战&#xff1a;如何破局…

矩阵的特征值和特征向量

矩阵的特征值和特征向量是线性代数中非常重要的概念&#xff0c;用于描述矩阵对向量的作用&#xff0c;特别是在矩阵对向量的线性变换中的表现。它们帮助我们理解矩阵在某些方向上的缩放或旋转效果。 1. 特征值和特征向量的定义&#xff1a; 给定一个 n n n \times n nn 的…

每天五分钟玩转深度学习框架pytorch:多种定义损失函数的方法

本文重点 再编译神经网络的时有两个必要的元素,其中一个是损失函数,另外一个是优化器。前面的专栏我们已经介绍了优化器,本节课程我们介绍损失函数。损失函数属于神经网络训练的第5步。 nn.Module 和 nn.functional的损失函数 我们前面介绍过nn.Module和nn.functional的区…

ArcGIS与ArcGIS Pro去除在线地图服务名单

我们之前给大家分享了很多在线地图集&#xff0c;有些地图集会带有制作者信息&#xff0c;在布局制图的时候会带上信息影响出图美观。 一套GIS图源集搞定&#xff01;清新规划底图、影像图、境界、海洋、地形阴影图、导航图 比如ArcGIS&#xff1a; 比如ArcGIS Pro&#xff1a…

网络编程,tcp,守护进程化,前后台任务,bash与shell,会话

上篇&#xff0c;我们讲解了udp服务器与客户端的功能&#xff0c;这篇我们将使用tcp协议来进行编程&#xff1b;tcp服务器相比较与udp要更加稳定与安全&#xff0c;tcp服务器是面向连接的数据传输&#xff1b; 1. tcp服务器与客户端 下面是我实现的完整代码可以辅助下面的讲解…

Redis相关知识

参考Redis 消息队列的三种方案&#xff08;List、Streams、Pub/Sub&#xff09; - 知乎 (zhihu.com) 各种开源的 MQ 已经足够使用了&#xff0c;为什么需要用 Redis 实现 MQ 呢&#xff1f; 优点&#xff1a; 简单轻量&#xff1a;Redis是一个内存中的数据存储系统&#xff…

如何只用 CSS 制作网格?

来源&#xff1a;how-to-make-a-grid-like-graph-paper-grid-with-just-css 在看 用于打印到纸张的 CSS 这篇文章时&#xff0c;对其中的网格比较好奇&#xff0c;作者提供了 stackoverflow 的链接&#xff0c;就看到了来源的这个问题和众多回复。本文从里面挑选了一些个人比较…

用python裁切PDF文件中的图片

想把所有pdf文件的图片下边裁切掉一块&#xff0c;用Adobe Acrobat只能一页页处理&#xff0c;于是想到了用python进行批处理。 代码如下&#xff1a; """ Title: cutPdfImage Author: JackieZheng Date: 2024-09-26 20:51:24 LastEditTime: 2024-09-26 22:14…