设计模式Java实现-中介者模式

180 阅读5分钟

✨这里是第七人格的博客✨小七,欢迎您的到来~✨

🍅系列专栏:设计模式🍅

✈️本篇内容: 中介者模式✈️

🍱 本篇收录完整代码地址:gitee.com/diqirenge/d… 🍱

楔子

重庆现在找工作简直是地狱难度,特别是对于年龄大,学历低的小伙伴来说更是如此,小七如果不走内推的话,也是连简历都过不了。但是,充实自己的学习还是要坚持下去。

需求背景

假设我们有一个在线聊天室,其中有多个用户(User)和一个聊天室管理员(ChatRoomAdmin)。用户可以发送消息、接收消息和退出聊天室,而聊天室管理员则负责管理聊天室,如添加新用户、移除用户等。

分析设计

根据需求我们可以使用中介者模式来简化这些类之间的关系。具体分析如下:

  • 解耦用户之间的交互:在聊天室中,用户通常需要发送消息给其他用户,如果每个用户都要知道其他所有用户的信息,那么将导致高度耦合。通过引入一个中介者(聊天室管理员ChatRoomAdmin),每个用户只需要知道中介者,而不需要知道具体的其他用户。这样,用户之间的通信就可以通过中介者来进行,从而降低耦合度。
  • 集中管理通信逻辑:聊天室中的通信逻辑可能相当复杂,例如处理私聊、群聊、消息转发等。将这些逻辑集中在中介者中处理,可以避免将这些复杂的逻辑分散到各个用户对象中去,使得代码更加模块化和易于维护。
  • 灵活地扩展新功能:随着聊天室业务的发展,可能需要增加新的功能,如添加机器人、实现高级消息过滤等。使用中介者模式可以在不修改现有用户类的基础上,通过扩展或替换中介者来增加新功能,这符合开闭原则。
  • 简化用户类的实现:用户类可以设计得非常简单,它们只需要负责发送消息给中介者和接收来自中介者的消息。其他的交互逻辑都交给中介者处理,这使得用户类的实现变得简单且易于理解。
  • 统一消息格式和处理:由于所有的消息都是通过中介者来转发的,因此可以在中介者中统一处理消息的格式和路由逻辑。这有助于减少错误和不一致,同时也便于监控和记录聊天室的活动。
  • 方便地扩展用户数量:当有新用户加入或者用户退出时,只需要通过中介者来更新状态,而不影响其他用户的正常运行。这样的设计可以灵活地适应用户规模的变化,保持良好的系统性能。
  • 实现用户之间的松耦合通信:在聊天室中,用户之间的关系是动态变化的,可能有的用户之间需要进行频繁的通信,而有的用户之间则几乎不交流。通过中介者模式,用户可以在不了解其他用户的情况下进行通信,实现了松耦合的通信方式。

URL图

根据分析设计,我们可以先画一个简单的URL图,后面通过URL图编码

中介者模式.png

模块名称

intermediary

模块地址

gitee.com/diqirenge/d…

模块描述

中介者模式代码示例

代码实现

1、编写中介者接口

定义中介者的行为

/**
 * 中介者接口 - 定义行为
 *
 * 关注公众号【奔跑的码畜】,一起进步不迷路
 *
 * @author 第七人格
 * @date 2024/05/24
 */
public interface Mediator {
    void sendMessage(String message, User user);

    void addUser(User user);

    void removeUser(User user);
}

2、编写用户类

/**
 * 用户类
 * 关注公众号【奔跑的码畜】,一起进步不迷路
 *
 * @author 第七人格
 * @date 2024/05/24
 */
public class User {
    private final String name;
    /**
     * 让用户知道中介者的存在
     * 用户类只关注中介者,不知道其他用户的存在
     */
    private final Mediator mediator;

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

    public void sendMessage(String message) {
        System.out.println(name + " 发送消息: " + message);
        mediator.sendMessage(message, this);
    }

    public void receiveMessage(String message) {
        System.out.println(name + " 接收消息: " + message);
    }
}

3、编写中介者类 -> 聊天室管理员

/**
 * 中介者类 -> 聊天室管理员
 * 关注公众号【奔跑的码畜】,一起进步不迷路
 *
 * @author 第七人格
 * @date 2024/05/24
 */
public class ChatRoomAdmin implements Mediator {
    /**
     * 中介者类 -> 聊天室管理员
     */
    private final List<User> users;

    public ChatRoomAdmin() {
        users = new ArrayList<>();
    }

    @Override
    public void sendMessage(String message, User user) {
        for (User u : users) {
            if (u != user) {
                u.receiveMessage(message);
            }
        }
    }

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

    @Override
    public void removeUser(User user) {
        users.remove(user);
    }
}

4、编写测试类

/**
 * 测试中介者模式
 * 关注公众号【奔跑的码畜】,一起进步不迷路
 *
 * @author 第七人格
 * @date 2024/05/24
 */
public class IntermediaryTest {

    @Test
    public void testIntermediary() {
        Mediator chatRoomAdmin = new ChatRoomAdmin();

        User user1 = new User("张三", chatRoomAdmin);
        User user2 = new User("李四", chatRoomAdmin);
        User user3 = new User("王五", chatRoomAdmin);

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

        user1.sendMessage("关注公众号【奔跑的码畜】,一起进步不迷路");
    }
}

4、测试结果

张三 发送消息: 关注公众号【奔跑的码畜】,一起进步不迷路

李四 接收消息: 关注公众号【奔跑的码畜】,一起进步不迷路

王五 接收消息: 关注公众号【奔跑的码畜】,一起进步不迷路

实现要点

中介者模式的实现要点在于正确定义中介者和同事对象的角色及其交互方式,确保对象之间的通信是通过中介者进行的,以此来降低系统的耦合度。

总结

中介者模式是一种行为设计模式,它允许对象之间通过一个中介对象进行通信,从而减少对象之间的依赖关系。