行为模式5.中介者模式-聊天室收发消息

行为型模式

  1. 模板方法模式(Template Method Pattern)
  2. 命令模式(Command Pattern)
  3. 迭代器模式(Iterator Pattern)
  4. 观察者模式(Observer Pattern)
  5. 中介者模式(Mediator Pattern)
  6. 备忘录模式(Memento Pattern)
  7. 解释器模式(Interpreter Pattern)
  8. 状态模式(State Pattern)
  9. 策略模式(Strategy Pattern)
  10. 职责链模式(Chain of Responsibility Pattern)
  11. 访问者模式(Visitor Pattern)

概述

中介者模式是一种行为设计模式,它定义了一个对象,用来封装一组对象之间的交互。中介者模式通过使对象之间的交互集中化,从而减少了对象之间的直接依赖关系。这样,减少了类与类之间的耦合性,使得它们之间的交互变得更加清晰和可维护。

在中介者模式中,所有对象通过中介者对象来进行交互,而不是直接相互联系。中介者通过协调各个对象的行为来实现它们之间的协作。

关键组成
  1. Mediator(中介者):定义一个接口,用于与各个同事对象进行交互。
  2. ConcreteMediator(具体中介者):实现 Mediator 接口,协调各个同事对象之间的交互。
  3. Colleague(同事):每个同事对象都知道中介者,并通过中介者与其他同事对象进行通信。
  4. ConcreteColleague(具体同事):实现 Colleague 接口,代表具体的同事类。
优点
  1. 减少类之间的依赖:对象不再直接引用其他对象,而是通过中介者进行交互,降低了耦合度。
  2. 集中化控制:所有的交互行为由中介者控制,代码更易于管理和扩展。
  3. 易于扩展:新增同事类时,基本上不需要修改原有代码,符合开闭原则。
缺点
  1. 中介者复杂化:中介者角色可能变得过于庞大,变得难以管理。
  2. 单一职责违反:一个中介者可能处理过多不同对象的交互,导致职责不单一。
适用场景
  1. 多个对象之间存在复杂的交互关系
  2. 希望通过减少对象间直接通信来降低耦合度
  3. 希望集中控制对象间的交互逻辑

Java 示例代码

假设我们有一个聊天室系统,多个用户(同事)可以在聊天室中发送和接收消息,但每个用户不直接与其他用户通信,而是通过一个中介者来协调消息的发送与接收。

// Mediator (中介者接口)
interface ChatMediator {
    void sendMessage(String message, User user);
    void addUser(User user);
}

// ConcreteMediator (具体中介者)
class ChatRoom implements ChatMediator {
    private List<User> users;

    public ChatRoom() {
        this.users = new ArrayList<>();
    }

    @Override
    public void sendMessage(String message, User user) {
        for (User u : users) {
            // 不向发送者自己发送消息
            if (u != user) {
                u.receive(message);
            }
        }
    }

    @Override
    public void addUser(User user) {
        users.add(user);
    }
}

// Colleague (同事接口)
abstract class User {
    protected ChatMediator mediator;
    protected String name;

    public User(ChatMediator mediator, String name) {
        this.mediator = mediator;
        this.name = name;
    }

    public abstract void send(String message);
    public abstract void receive(String message);
}

// ConcreteColleague (具体同事)
class ConcreteUser extends User {
    
    public ConcreteUser(ChatMediator mediator, String name) {
        super(mediator, name);
    }

    @Override
    public void send(String message) {
        System.out.println(this.name + " sends message: " + message);
        mediator.sendMessage(message, this);
    }

    @Override
    public void receive(String message) {
        System.out.println(this.name + " receives message: " + message);
    }
}

// 客户端代码示例
public class MediatorPatternExample {
    public static void main(String[] args) {
        // 创建中介者对象(聊天室)
        ChatMediator chatRoom = new ChatRoom();

        // 创建具体用户并加入聊天室
        User user1 = new ConcreteUser(chatRoom, "Alice");
        User user2 = new ConcreteUser(chatRoom, "Bob");
        User user3 = new ConcreteUser(chatRoom, "Charlie");

        chatRoom.addUser(user1);
        chatRoom.addUser(user2);
        chatRoom.addUser(user3);

        // 用户发送消息
        user1.send("Hello, everyone!");
        user2.send("Hi Alice!");
        user3.send("Hey all!");
    }
}

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

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

相关文章

医院机房运维:所有IT资源运行状态同一平台实时呈现

在当今数字化医疗高速发展的时代&#xff0c;医院的信息化系统已然成为保障医疗服务顺畅开展、守护患者生命健康的关键基础设施。以郑州人民医院为例&#xff0c;随着医疗业务不断拓展&#xff0c;其背后支撑的机房运维面临着诸多棘手难题。 传统的分散式人工维护模式&#xff…

AcWing练习题:油耗

给定一个汽车行驶的总路程&#xff08;km&#xff09;和消耗的油量&#xff08;l&#xff09;&#xff0c;请你求出汽车每消耗 1 升汽油可行驶多少公里路程。 输入格式 输入共两行&#xff0c;第一行包含整数 X&#xff0c;表示行驶总路程。 第二行包含保留一位小数的浮点数…

前后端规约

文章目录 引言I 【强制】前后端交互的 API请求内容响应体响应码II 【推荐】MVC响应体III【参考】IV 其他引言 服务器内部重定向必须使用 forward;外部重定向地址必须使用 URL 统一代理模块生成,否则会因线上采用 HTTPS 协议而导致浏览器提示“不安全”,并且还会带来 URL 维护…

Redis(二)value 的五种常见数据类型简述

目录 一、string&#xff08;字符串&#xff09; 1、raw 2、int 3、embstr 二、hash&#xff08;哈希表&#xff09; 1、hashtable 2、ziplist 三、list&#xff08;列表&#xff09; ​编辑 1、linkedlist 2、ziplist 3、quicklist&#xff08;redis 3.2后的列表内…

RabbitMQ 客户端 连接、发送、接收处理消息

RabbitMQ 客户端 连接、发送、接收处理消息 一. RabbitMQ 的机制跟 Tcp、Udp、Http 这种还不太一样 RabbitMQ 服务&#xff0c;不是像其他服务器一样&#xff0c;负责逻辑处理&#xff0c;然后转发给客户端 而是所有客户端想要向 RabbitMQ服务发送消息&#xff0c; 第一步&a…

仿生的群体智能算法总结之二(十种)

群体智能算法是一类通过模拟自然界中的群体行为来解决复杂优化问题的方法。以下是10种常见的群体智能算法,接上文https://blog.csdn.net/lzm12278828/article/details/144933367仿生的群体智能算法总结之一(十种)-CSDN博客https://blog.csdn.net/lzm12278828/article/detail…

Jenkins(持续集成与自动化部署)

Jenkins 是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具。 官网&#xff1a;https://www.jenkins.io/ GitLab安装使用 安装前提&#xff1a;内存至少需要4G 官方网站&#xff1a;https://about.gitlab.com/ 安装文档&#xff1a;https://docs.gitlab.c…

Luma AI 简单几步生成视频

简单几步生成视频 登录我们的 AceDataPlatform 网站&#xff0c;按照下图所示即可生成高质量的视频&#xff0c;同时&#xff0c;我们也提供了简单易用的 API 方便集成调用&#xff0c;可以查看 Luma API了解详情 技术介绍 我们使用了 Luma 的技术&#xff0c;实现了上面的图…

Day17补代码随想录 654.最大二叉树|617.合并二叉树|700.二叉搜索树中的搜索|98.验证二叉搜索树

654.最大二叉树 题目 【体会为什么构造二叉树都是前序遍历】 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右…

vue代理问题

vue代理问题 场景:前后端分离项目问题,在前端中请求接口,返回数据这个过程,但是在这个过程中,前端会有两个环境,一个是开发环境,一个是生产环境. 在开发环境中请求接口可能会遇到跨域问题,比如请求的端口是3000,当前端口是8080,这时候就会遇到跨域问题,或者ip不同,也会存在跨…

学英语学压测:02jmeter组件-测试计划和线程组ramp-up参数的作用

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#xff1a;先看关键单词&#xff0c;再看英文&#xff0c;最后看中文总结&#xff0c;再回头看一遍英文原文&#xff0c;效果更佳&#xff01;&#xff01; 关键词 Functional Testing功能测试[ˈfʌŋkʃənəl ˈtɛstɪŋ]Sample样…

phpIPAM容器化部署场景下从1.5.x更新到1.7.0提示禁用安装脚本配置的处理

phpIPAM容器化部署场景下从1.5.x更新到1.7.0&#xff0c;在系统登录页面出现“Please disable installaion scripts....”提示&#xff0c;本文件记录处理过程。 一、问题描述 phpIPAM从1.5.x更新到1.7.0&#xff0c;在系统登录页面出现提示&#xff1a; “Please disable in…

第三届图像处理、计算机视觉与机器学习国际学术会议(ICICML 2024)

目录 重要信息 大会简介 组织单位 大会成员 征稿主题 会议日程 参会方式 重要信息 大会官网&#xff1a;www.icicml.org 大会时间&#xff1a;2024年11月22日-24日 大会地点&#xff1a;中国 深圳 大会简介 第三届图像处理、计算机视觉与机器学…

技术人做Youtuber第一次实战

2025年第一篇&#xff0c;新年好~ 大概2012年还是大三时&#xff0c;不记得从哪里搞到了youtube注册方法&#xff0c;注册了youtube, facebook等被"walled"的网站&#xff0c;当时沉迷海贼王&#xff0c;上传了类似"六分钟看海贼王多热血"的视频&#xff0…

仓颉笔记——windows11安装启用cangjie语言,并使用vscode编写“你好,世界”

2025年1月1日第一篇日记&#xff0c;大家新年好。 去年就大致看了一下&#xff0c;感觉还不错&#xff0c;但一直没上手&#xff0c;这次借着元旦的晚上安装了一下&#xff0c;今年正式开动&#xff0c;公司众多的应用国产化正等着~~ 第一步&#xff1a;准备 官网&#xff1a;…

大模型数据采集和预处理:把所有数据格式,word、excel、ppt、jpg、pdf、表格等转为数据

大模型数据采集和预处理&#xff1a;把所有数据格式&#xff0c;word、excel、ppt、jpg、pdf、表格等转为数据 文本/图片/表格&#xff0c;分别提取处理工具选择不同格式文件&#xff0c;使用不同工具处理1. 确认目标2. 分析过程(目标-手段分析法)3. 实现步骤4. 代码封装效果展…

使用函数求e的近似值(PTA)C语言

自然常数e可以用级数11/1!1/2!⋯1/n!来近似计算。本题要求实现一个计算阶乘的简单函数&#xff0c;使得可以利用该函数&#xff0c;对给定的非负整数n&#xff0c;求该级数的前n1项和。 函数接口定义&#xff1a; double fact( int n ); 其中n是用户传入的参数&#xff0c;函…

9.系统学习-卷积神经网络

9.系统学习-卷积神经网络 简介输入层卷积层感受野池化层全连接层代码实现 简介 卷积神经网络是一种用来处理局部和整体相关性的计算网络结构&#xff0c;被应用在图像识别、自然语言处理甚至是语音识别领域&#xff0c;因为图像数据具有显著的局部与整体关系&#xff0c;其在图…

循环冗余校验CRC的介绍

一、简介 循环冗余校验CRC&#xff08;Cyclic Redundancy Check&#xff09;是数据通信领域中最常用的一种差错校验码。该校验方法中&#xff0c;使用多项式出发&#xff08;模2除法&#xff09;运算后的余数为校验字段。CRC只能实现检错&#xff0c;不能实现纠错&#xff0c;使…

C语言 数组名

1.数组名 数组名是数组首元素的地址。 数组名确实能表示首元素的地址 但是有两个例外&#xff1a; 1.sizeof(数组名&#xff09;,这里的数组名表示整个数组&#xff0c;计算的是整个数组的大小&#xff0c;单位是字节 2.&数组名&#xff0c;这里的数组名表示整个数组&…