Loading...

设计模式-中介者模式

前言

Java开发中,设计模式是常用的一种编码方式,合理使用设计模式可以帮助开发人员更快地编写出高效、可靠和可维护的代码。本期将撰写一个关于设计模式的系列文章,总共23种设计模式将以一篇一篇文章讲解,代码笔记已开源至:Gitee点击跳转。在上一篇《Java设计模式(15)迭代器模式》文章中,我们介绍了迭代器模式。本文是这个系列的第十六篇章,我们将讲解一下中介者模式的实现方式、应用场景以及它的用途。

中介者模式

中介者模式是一种行为设计模式,它通过一个中介者对象来封装一组对象之间的交互,使得这些对象不需要显式地相互引用,从而使它们之间的耦合松散,方便独立地改变它们之间的交互。中介者模式的核心在于通过中介者对象集中管理和控制对象之间的交互,从而简化对象之间的复杂交互关系。

使用场景

  • 当一个对象的改变会导致多个其他对象的连锁反应时,中介者模式可以将这些复杂的交互逻辑集中到一个中介者对象中
  • 在一个系统中,如果对象之间的耦合度过高,修改一个对象会影响到其他多个对象,那么可以使用中介者模式来解耦
  • 如果系统中对象之间的通信非常复杂,中介者模式可以通过引入一个中介者对象来简化这些逻辑

代码实现

以下是一个使用中介者模式的简单示例。我们将创建一个简单的群发系统,包含UserChatMediator

/**
 * 中介者接口
 * @author Jensen
 * @date 2024-07-13
 * */
public interface ChatMediator {
    void sendMessage(String message, User user);
    void addUser(User user);
}

/**
 * ChatMediator具体实现
 * @author Jensen
 * @date 2024-07-13
 * */
public class ChatMediatorImpl implements ChatMediator{
    private final List<User> users;

    public ChatMediatorImpl(List<User> users) {
        this.users = users;
    }


    @Override
    public void sendMessage(String message, User user) {
        for (User u : users){
            // 发给其他用户
            if (u != user)
                u.receive(message);
        }
    }

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


/**
 * 抽象用户类
 * @author Jensen
 * @date 2024-07-13
 * */
public 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);
}

/**
 * 抽象用户具体实现
 * @author Jensen
 * @date 2024-07-13
 * */
public class UserImpl extends User {
    public UserImpl(ChatMediator mediator, String name) {
        super(mediator, name);
    }

    @Override
    public void send(String message) {
        mediator.sendMessage(message, this);
    }

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

以上 ChatMediator 定义了发送消息和添加用户的方法。

ChatMediatorImpl 实现了 ChatMediator 接口,管理用户列表并实现消息的发送逻辑。 sendMessage 方法遍历用户列表,将消息发送给所有其他用户。

抽象类 User 包含一个对中介者的引用以及用户的名字。 定义了发送消息和接收消息的抽象方法。

UserImpl 实现了 User 类的发送和接收消息的方法。 send 方法通过中介者发送消息,receive 方法用于接收消息。

测试

System.out.println("------------------------------中介者模式-----------------------------");
ChatMediator chatMediator = new ChatMediatorImpl(new ArrayList<>());

//为此聊天室添加一些用户
User zhangsan = new UserImpl(chatMediator, "张三");
User lisi = new UserImpl(chatMediator, "李四");
User wangwu = new UserImpl(chatMediator, "王五");
User zhaoliu = new UserImpl(chatMediator, "赵六");
chatMediator.addUser(zhangsan);
chatMediator.addUser(lisi);
chatMediator.addUser(wangwu);
chatMediator.addUser(zhaoliu);
//张三发消息
zhangsan.send("大家好,我是张三");

输出结果

------------------------------中介者模式-----------------------------
李四 收到消息: 大家好,我是张三
王五 收到消息: 大家好,我是张三
赵六 收到消息: 大家好,我是张三

结语

中介者模式广泛应用于各种需要简化对象之间复杂交互的场景,如 GUI 组件交互、聊天系统、MVC模型和视图之间的通信和控制都可以通过中介者来实现等等。

0

回到顶部