中介者模式(Mediator)
定义
用一个中介对象来封装一系列的对象交互,使各对象不需要显式地相互引用。
使用场景
主要角色
- 抽象中介者(Mediator):定义了中介者的接口,包含了各个同事对象之间交互所需的方法。
- 具体中介者(Concrete Mediator):实现了抽象中介者的接口,协调各个同事对象之间的交互关系。
- 抽象同事类(Colleague):定义了同事类的接口,包含了具体的业务方法以及需要与其他同事对象交互时的方法。
- 具体同事类(Concrete Colleague):实现了抽象同事类的接口,包含了具体的业务方法以及需要与其他同事对象交互时的方法。在需要与其他同事对象通信时,会通过中介者来进行通信。
类图
示例代码
代码语言: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!
工作中遇到场景
- 在Spring MVC中,DispatcherServlet充当了中介者的角色,它接收所有的HTTP请求,并根据请求的URL将请求分发给不同的Controller进行处理。
- 在Spring中,ApplicationContext充当了中介者的角色,它管理了各个Bean之间的依赖关系,当一个Bean需要依赖另一个Bean时,ApplicationContext会负责将依赖注入到Bean中。
- 在Spring Cloud中,Eureka充当了中介者的角色,它维护了各个微服务之间的注册和发现关系,当一个微服务需要调用另一个微服务时,Eureka会负责将请求转发到目标微服务。