Bootstrap

中介者模式

中介者模式(Mediator Pattern),是一种行为型设计模式。它通过引入一个中介者对象来封装一系列对象之间的交互逻辑,使得这些对象不再直接相互引用,而是通过中介者进行沟通。这种模式有助于减少对象间的耦合度,简化了系统的维护和扩展工作,并且可以更容易地管理和控制复杂的交互流程。

中介者模式的特点

  1. 降低耦合度:原本需要互相了解的对象现在只需要知道中介者即可,从而降低了对象之间的依赖关系。
  2. 集中化管理:所有对象间的协作都被集中到中介者中处理,便于维护和修改。
  3. 符合开闭原则:新的同事类(Colleague)可以很容易地添加进来,而不会影响现有代码结构。
  4. 简化对象协议:对象之间不需要直接通信,减少了接口的复杂性。
  5. 支持广播消息:中介者可以作为消息中心,将事件或命令传递给多个感兴趣的同事类。

中介者模式的组成

  • Mediator(抽象中介者接口/抽象类):定义了同事类用来与中介者通信的方法,如send()方法用于发送消息。
  • ConcreteMediator(具体中介者):实现了Mediator接口,并维护了一份同事类的引用列表。它负责协调各个同事类之间的交互,当收到消息时会根据具体情况做出响应。
  • Colleague(抽象同事类接口/抽象类):声明了一些方法供具体同事类实现,通常包括了一个指向中介者的引用,以便能够向中介者发送消息。
  • ConcreteColleague(具体同事类):实现了Colleague接口,包含了自身的业务逻辑以及与其他同事类交互所需的逻辑。每个具体同事类都持有一个指向中介者的引用,用于发送消息或请求服务。

中介者模式的实现

我们将通过一个简单的例子来演示中介者模式的应用:假设我们正在开发一个聊天室应用程序,用户可以在其中发送消息给其他用户。我们可以使用中介者模式来管理用户之间的消息传递,确保用户之间不直接通信,而是通过聊天室这个中介者来进行交流。

示例代码

// 抽象中介者 - ChatRoom
interface ChatRoom {
    void sendMessage(String message, User user);
}

// 具体中介者 - ConcreteChatRoom
class ConcreteChatRoom implements ChatRoom {
    private final List<User> users = new ArrayList<>();

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

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

// 抽象同事类 - User
abstract class User {
    protected ChatRoom chatRoom;
    protected String name;

    public User(ChatRoom chatRoom, String name) {
        this.chatRoom = chatRoom;
        this.name = name;
    }

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

// 具体同事类 - ConcreteUser
class ConcreteUser extends User {
    public ConcreteUser(ChatRoom chatRoom, String name) {
        super(chatRoom, name);
    }

    @Override
    public void send(String message) {
        System.out.println(this.name + ": Sending Message=" + message);
        chatRoom.sendMessage(message, this);
    }

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

使用示例

public class MediatorPatternDemo {
    public static void main(String[] args) {
        // 创建具体的中介者对象
        ChatRoom chatRoom = new ConcreteChatRoom();

        // 创建具体的同事类对象
        User user1 = new ConcreteUser(chatRoom, "John");
        User user2 = new ConcreteUser(chatRoom, "Jane");
        User user3 = new ConcreteUser(chatRoom, "Jim");

        // 将用户加入聊天室
        chatRoom.addUser(user1);
        chatRoom.addUser(user2);
        chatRoom.addUser(user3);

        // 模拟用户之间的消息传递
        user1.send("Hi Everyone!");
        user2.send("Hello John!");
    }
}

中介者模式的应用场景

  • 当你有一组对象,它们之间存在复杂的交互关系,但又不想让它们直接相互引用时。
  • 如果希望将一组对象之间的交互逻辑集中在一个地方进行管理,以提高系统的可维护性和灵活性。
  • 在GUI编程中,组件之间的协作往往非常复杂,中介者模式可以帮助组织这些交互。
  • 对于那些具有“多对多”关系的对象群集,如社交网络中的好友互动、即时通讯软件中的群聊功能等,中介者模式提供了一种有效的解决方案。
  • 实现事件驱动系统,例如发布-订阅模型,其中多个订阅者监听同一主题的变化。

结语

希望本文能帮助您更好地理解中介者模式的概念及其实际应用。如果您有任何疑问或建议,请随时留言交流。

;