当前位置: 首页 > article >正文

行为模式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!");
    }
}


http://www.kler.cn/a/464874.html

相关文章:

  • 法律专业legal case的留学论文写作技巧分析(1)
  • 《深入浅出HTTPS​​​​​​​​​​​​​​​​​》读书笔记(24):椭圆曲线密码学
  • 基层医联体医院患者历史检验检查数据的快速Python编程分析
  • Python爬虫 - 豆瓣图书数据爬取、处理与存储
  • docker使用国内镜像
  • HackMyVM-Airbind靶机的测试报告
  • 在React中引入tailwind css(图文详解)
  • PyTorch快速入门
  • 制作一个类似ChatGPT的AI对话网站,模型能力使用ChatGPT
  • Pycharm访问 Redis 数据库
  • 语音识别基础算法——动态时间规整算法
  • 机器学习基础-卷积的计算
  • 全新免押租赁系统助力商品流通高效安全
  • 【大模型实战篇】LLaMA Factory微调ChatGLM-4-9B模型
  • 智能客户服务:科技如何重塑客户服务体验
  • IDEA2023.1修改默认Maven配置
  • 0基础跟德姆(dom)一起学AI 自然语言处理08-认识RNN模型
  • 如何在notepad++里面,修改注释颜色
  • 什么是区块链的“智能合约”
  • MySQL--》如何在SQL中巧妙运用函数与约束,优化数据处理与验证?
  • Oracle exp和imp命令导出导入dmp文件
  • RabbitMQ基础篇之Java客户端 基于注解声明队列交换机
  • 记录一下图像处理的基础知识
  • MBox20边缘计算网关助力各种数字化升级
  • windows C#-字符串和字符串字面量(四)
  • 【运维专题】大数据面试笔试宝典之大数据运维面试(一)