(十 九)趣学设计模式 之 中介者模式!

发布于:2025-03-04 ⋅ 阅读:(16) ⋅ 点赞:(0)

在这里插入图片描述


🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解观察者模式请看: (十 八)趣学设计模式 之 观察者模式!
✨更多请看个人主页: 码熔burning

一、 啥是中介者模式?

想象一下,一个繁忙的机场 ✈️。 飞机之间不能直接通信,而是通过空中交通管制员(中介者)来协调起飞、降落等操作。 中介者模式就像是这个空中交通管制员,它负责协调多个对象之间的交互,避免对象之间直接耦合。

中介者模式,就是用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互 🎁。

简单来说,就是找个“中间人”来协调多个对象之间的关系,避免大家直接“吵架”!

  • 多个对象之间存在复杂的交互关系: 就像多个飞机需要在机场协调起飞、降落 🛬🛫!
  • 对象之间的耦合度很高: 就像飞机之间直接通信,一旦一个飞机出现问题,可能会影响其他飞机 💥!
  • 你需要集中控制对象之间的交互: 就像需要空中交通管制员来统一协调飞机的行为 👮!

二、 为什么要用中介者模式?

用中介者模式,好处多多 👍:

  • 解耦对象之间的关系: 对象之间不需要直接引用,而是通过中介者进行通信 🤝!
  • 简化对象之间的交互: 将复杂的交互逻辑封装到中介者中,使得对象更加简单 💫!
  • 集中控制交互: 可以方便地修改和扩展对象之间的交互逻辑 ⚙️!
  • 提高代码的可维护性和可复用性: 将交互逻辑集中管理,使得代码更加清晰易懂 💡!

三、 中介者模式的实现方式

中介者模式主要包含两个核心概念:

  • 中介者(Mediator): 定义了一个接口,用于与各个同事对象通信。它知道所有的同事对象,并负责协调它们之间的交互 🏠!
  • 同事(Colleague): 定义了一个接口,用于与中介者通信。它不知道其他的同事对象,只知道自己的行为 ⚙️!
// 抽象同事类:用户

public abstract class User {
    protected ChatRoom mediator; // 中介者

    protected String name;

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

    public abstract void send(String message); // 发送消息

    public abstract void receive(String message); // 接收消息

    public String getName() {
        return name;
    }
}

// 具体同事类:普通用户

public class ConcreteUser extends User {

    public ConcreteUser(ChatRoom mediator, String name) {
        super(mediator, name);
    }

    @Override
    public void send(String message) {
        System.out.println(this.getName() + " 发送消息: " + message);
        mediator.sendMessage(message, this); // 通过中介者发送消息
    }

    @Override
    public void receive(String message) {
        System.out.println(this.getName() + " 接收消息: " + message);
    }
}

// 抽象中介者:聊天室

public interface ChatRoom {
    void sendMessage(String message, User user); // 发送消息
}

// 具体中介者:具体聊天室

public class ConcreteChatRoom implements ChatRoom {

    private List<User> users = new ArrayList<>();

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

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

// 客户端

public class Client {
    public static void main(String[] args) {
        // 创建聊天室
        ConcreteChatRoom chatRoom = new ConcreteChatRoom();

        // 创建用户
        User user1 = new ConcreteUser(chatRoom, "张三");
        User user2 = new ConcreteUser(chatRoom, "李四");
        User user3 = new ConcreteUser(chatRoom, "王五");

        // 注册用户
        chatRoom.register(user1);
        chatRoom.register(user2);
        chatRoom.register(user3);

        // 用户发送消息
        user1.send("大家好!");
        user2.send("今天天气不错!");
    }
}

代码解释

  • User 类是抽象同事类,定义了 sendreceive 方法,用于发送和接收消息。
  • ConcreteUser 类是具体同事类,实现了 User 类,负责处理用户的具体行为。
  • ChatRoom 接口是抽象中介者,定义了 sendMessage 方法,用于发送消息。
  • ConcreteChatRoom 类是具体中介者,实现了 ChatRoom 接口,负责协调用户之间的消息传递。

输出结果

张三 发送消息: 大家好!
李四 接收消息: 大家好!
王五 接收消息: 大家好!
李四 发送消息: 今天天气不错!
张三 接收消息: 今天天气不错!
王五 接收消息: 今天天气不错!

四、 中介者模式的优缺点

优点:

  • 解耦对象之间的关系 🤝!
  • 简化对象之间的交互 💫!
  • 集中控制交互 ⚙️!
  • 提高代码的可维护性和可复用性 💡!

缺点:

  • 中介者类可能会变得过于复杂,难以维护 😫!
  • 如果中介者出现问题,可能会影响整个系统的运行 🤯!

五、 中介者模式的应用场景

  • 聊天室: 用户之间通过聊天室进行通信 💬!
  • MVC 框架: 控制器作为中介者,协调模型和视图之间的交互 🖼️!
  • 机场空中交通管制: 协调飞机起飞、降落 ✈️!
  • 智能家居系统: 协调各种智能设备之间的交互 🏠!

六、 总结

  • 中介者模式就像“中间人”,协调多个对象之间的关系,避免大家直接“吵架”! 🤝
  • 核心概念包括中介者和同事! 🔑
  • 优点是解耦对象之间的关系、简化对象之间的交互、集中控制交互、提高代码的可维护性和可复用性! 👍
  • 缺点是中介者类可能会变得过于复杂,难以维护、如果中介者出现问题,可能会影响整个系统的运行! 👎
  • 适用于多个对象之间存在复杂的交互关系,并且对象之间的耦合度很高的场景! 🎯

希望这篇文章能让你彻底理解中介者模式! 💯 祝你学习愉快! 😄
看完请看:(二 十)趣学设计模式 之 迭代器模式!