设计模式之中介者模式

2024-04-16 08:06:59 浏览数 (3)

中介者模式(Mediator)

定义

用一个中介对象来封装一系列的对象交互,使各对象不需要显式地相互引用。

使用场景

主要角色

  1. 抽象中介者(Mediator):定义了中介者的接口,包含了各个同事对象之间交互所需的方法。
  2. 具体中介者(Concrete Mediator):实现了抽象中介者的接口,协调各个同事对象之间的交互关系。
  3. 抽象同事类(Colleague):定义了同事类的接口,包含了具体的业务方法以及需要与其他同事对象交互时的方法。
  4. 具体同事类(Concrete Colleague):实现了抽象同事类的接口,包含了具体的业务方法以及需要与其他同事对象交互时的方法。在需要与其他同事对象通信时,会通过中介者来进行通信。

类图

image-20240109172236025image-20240109172236025

示例代码

代码语言:javascript复制
public interface ChatMediator {
    void sendMessage(String message, User user);
}
代码语言:javascript复制
public class ChatMediatorImpl implements ChatMediator{
    @Override
    public void sendMessage(String message, User user) {
        for (User u : getUsers()) {
            // 排除发送者,避免发送给自己
            if (!u.equals(user)) {
                u.receiveMessage(message);
            }
        }
    }
    public List<User> getUsers(){
        List<User> userList = new ArrayList<>();
        userList.add(new ChatUser(this,"张三"));
        userList.add(new ChatUser(this,"李斯"));
        userList.add(new ChatUser(this,"王武"));
        return userList;
    }
}
代码语言:javascript复制
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 sendMessage(String message);

    public abstract void receiveMessage(String message);

}
代码语言:javascript复制
public class ChatUser extends User{
    public ChatUser(ChatMediator mediator, String name) {
        super(mediator, name);
    }
    @Override
    public void sendMessage(String message) {
        System.out.println(name   " sends: "   message);
        mediator.sendMessage(message, this);
    }

    @Override
    public void receiveMessage(String message) {
        System.out.println(name   " receives: "   message);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(name, user.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name);
    }
}
代码语言:javascript复制
public class Client {
    public static void main(String[] args) {
        ChatMediator mediator = new ChatMediatorImpl();
        User user1 = new ChatUser(mediator, "张三");
        user1.sendMessage("Hello, everyone!");
    }
}
代码语言:javascript复制
张三 sends: Hello, everyone!
李斯 receives: Hello, everyone!
王武 receives: Hello, everyone!

工作中遇到场景

  1. 在Spring MVC中,DispatcherServlet充当了中介者的角色,它接收所有的HTTP请求,并根据请求的URL将请求分发给不同的Controller进行处理。
  2. 在Spring中,ApplicationContext充当了中介者的角色,它管理了各个Bean之间的依赖关系,当一个Bean需要依赖另一个Bean时,ApplicationContext会负责将依赖注入到Bean中。
  3. 在Spring Cloud中,Eureka充当了中介者的角色,它维护了各个微服务之间的注册和发现关系,当一个微服务需要调用另一个微服务时,Eureka会负责将请求转发到目标微服务。

1 人点赞