中介者模式用于减少多个对象之间的直接通信,而是通过一个中介对象来协调它们之间的交互。下面我用一个聊天室的例子来演示这个模式。
举个栗子:聊天室系统
在这个系统中,用户不直接相互发送消息,而是通过聊天室(中介者)来转发消息。
1. 定义中介者接口
// 中介者接口
public interface ChatRoomMediator {void sendMessage(String message, User user);void addUser(User user);
}
2. 实现具体中介者 - 聊天室
import java.util.ArrayList;
import java.util.List;// 具体中介者 - 聊天室
public class ChatRoom implements ChatRoomMediator {private List<User> users;public ChatRoom() {this.users = new ArrayList<>();}@Overridepublic void addUser(User user) {this.users.add(user);}@Overridepublic void sendMessage(String message, User sender) {for (User user : users) {// 不将消息发送给自己if (user != sender) {user.receive(message);}}}
}
3. 定义同事类 - 用户
// 同事类 - 用户
public abstract class User {protected ChatRoomMediator mediator;protected String name;public User(ChatRoomMediator mediator, String name) {this.mediator = mediator;this.name = name;}public abstract void send(String message);public abstract void receive(String message);
}
4. 实现具体同事类 - 聊天用户
// 具体同事类 - 聊天用户
public class ChatUser extends User {public ChatUser(ChatRoomMediator mediator, String name) {super(mediator, name);}@Overridepublic void send(String message) {System.out.println(this.name + " 发送: " + message);mediator.sendMessage(message, this);}@Overridepublic void receive(String message) {System.out.println(this.name + " 收到: " + message);}
}
测试类
public class ChatRoomDemo {public static void main(String[] args) {// 创建中介者 - 聊天室ChatRoomMediator chatRoom = new ChatRoom();// 创建用户并加入聊天室User john = new ChatUser(chatRoom, "John");User jane = new ChatUser(chatRoom, "Jane");User doe = new ChatUser(chatRoom, "Doe");chatRoom.addUser(john);chatRoom.addUser(jane);chatRoom.addUser(doe);// 用户发送消息john.send("大家好!");jane.send("你好 John!");doe.send("今天天气不错!");}
}
输出结果
这个过程有点像netty实现简单聊天室的功能,不过对于项目中的聊天室来说,用户信息是初步封装好的,除非需要二次封装,这里只简单介绍一下这个中介者模式。
关键点解析
-
Mediator (中介者接口):定义同事对象通信的接口
-
ConcreteMediator (具体中介者):协调各同事对象的交互
-
Colleague (同事类):知道其中介者对象,通信时通过中介者转发
-
ConcreteColleague (具体同事类):实现自己的行为,需要与其他同事通信时通过中介者
中介者模式的优点
-
减少类间依赖:将多对多关系转化为一对多关系
-
集中控制:交互逻辑集中在中介者中,易于维护
-
简化对象协议:用中介者和同事的一对多交互替代多对多交互
适用场景
-
系统中对象之间存在复杂的引用关系
-
需要集中管理对象间的交互行为
-
想定制一个分布在多个类中的行为,又不想生成太多子类
这个聊天室的例子很好地展示了中介者模式如何简化对象间的通信,特别是在多对象相互交互的复杂场景中。