行为模式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!");
    }
}
相关推荐
捕鲸叉5 天前
C++软件设计模式之中介者模式
c++·设计模式·中介者模式
MinBadGuy5 天前
【GeekBand】C++设计模式笔记17_Mediator_中介者模式
设计模式·中介者模式
opentogether8 天前
中介者模式(Mediator Pattern)、桥接模式(Bridge Pattern) 和 策略模式(Strategy Pattern)
桥接模式·策略模式·中介者模式
冀晓武8 天前
C++ 设计模式:中介者模式(Mediator Pattern)
c++·设计模式·中介者模式
西岭千秋雪_12 天前
设计模式の中介者&发布订阅&备忘录模式
java·观察者模式·设计模式·中介者模式·备忘录模式
越甲八千14 天前
重温设计模式--中介者模式
windows·设计模式·中介者模式
我码玄黄19 天前
JS设计模式之中介者模式
javascript·设计模式·中介者模式
岳轩子1 个月前
23种设计模式之中介者模式
设计模式·中介者模式
Theodore_10221 个月前
21 设计模式之中介者模式
java·算法·设计模式·java-ee·开发·中介者模式