中介者模式(Mediator Pattern)是一种行为设计模式,旨在减少对象之间的直接通信,通过引入一个中介对象(中介者)来集中控制和协调这些对象之间的交互。中介者模式的定义如下:
中介者模式指的是使用一个中介对象来封装一系列对象之间的交互,使得对象之间不再显式地相互引用,而是通过中介者对象来进行通信。这样一来,对象之间的耦合度降低,增加新对象也更加容易,因为它们不需要知道彼此的细节,只需了解中介者的接口即可。中介者模式包含以下主要角色:
通过中介者模式,对象之间的通信被封装到中介者对象中,对象之间的直接联系减少,降低了耦合性,提高了代码的可维护性和灵活性。这种模式特别适用于对象之间的交互较复杂、互相依赖性较高的情况。
当涉及实际的聊天室示例时,涉及到实时通信、用户界面等复杂性,这在文字交流中无法完全展示。以下是一个简化的 Java 示例,模拟了聊天室的基本功能,用于演示中介者模式的基本思想:
// 中介者接口
public interface ChatRoomMediator {
void sendMessage(String message, User user);
void addUser(User user);
}
import java.util.ArrayList;
import java.util.List;
// 具体中介者 - 聊天室
public class ChatRoom implements ChatRoomMediator {
private List<User> users;
public ChatRoom() {
this.users = new ArrayList<>();
}
@Override
public void sendMessage(String message, User user) {
for (User u : users) {
// 排除发送者,向其他用户发送消息
if (u != user) {
u.receive(message);
}
}
}
@Override
public void addUser(User user) {
users.add(user);
}
}
// 同事对象 - 用户
public class User {
private String name;
private ChatRoomMediator mediator;
public User(String name, ChatRoomMediator mediator) {
this.name = name;
this.mediator = mediator;
this.mediator.addUser(this);
}
public void send(String message) {
mediator.sendMessage(message, this);
}
public void receive(String message) {
System.out.println(name + " 接受的消息: " + message);
}
}
// 测试类
public class MediatorPatternExample {
public static void main(String[] args) {
ChatRoomMediator chatRoom = new ChatRoom();
User user1 = new User("程咬金", chatRoom);
User user2 = new User("妲己", chatRoom);
User user3 = new User("赵子龙", chatRoom);
user1.send("Hello, 我是程咬金!");
user2.send("Hi, 妲己来了!");
user3.send("Ha, 常山赵子龙在此!");
}
}
运行结果:
妲己 接受的消息: Hello, 我是程咬金!
赵子龙 接受的消息: Hello, 我是程咬金!
程咬金 接受的消息: Hi, 妲己来了!
赵子龙 接受的消息: Hi, 妲己来了!
程咬金 接受的消息: Ha, 常山赵子龙在此!
妲己 接受的消息: Ha, 常山赵子龙在此!
这个简化的示例展示了中介者模式在聊天室场景中的应用。ChatRoom 充当中介者,负责用户之间的消息分发;User 是同事对象,通过中介者发送消息。在测试类中,演示了用户发送消息并接收消息的过程。这个例子是一个简单的演示,实际的聊天室系统要复杂得多,包括实时通信、界面等功能。
中介者模式具有以下优点和缺点:
优点
缺点
总的来说,中介者模式适用于系统中对象之间的交互较为复杂、对象之间耦合度较高的场景。它能够有效地将对象之间的交互逻辑进行集中管理,但在使用过程中需要注意合理分配中介者的职责,避免中介者过于臃肿。