中介者模式(Mediator Pattern),是一种行为型设计模式。它通过引入一个中介者对象来封装一系列对象之间的交互逻辑,使得这些对象不再直接相互引用,而是通过中介者进行沟通。这种模式有助于减少对象间的耦合度,简化了系统的维护和扩展工作,并且可以更容易地管理和控制复杂的交互流程。
中介者模式的特点
- 降低耦合度:原本需要互相了解的对象现在只需要知道中介者即可,从而降低了对象之间的依赖关系。
- 集中化管理:所有对象间的协作都被集中到中介者中处理,便于维护和修改。
- 符合开闭原则:新的同事类(Colleague)可以很容易地添加进来,而不会影响现有代码结构。
- 简化对象协议:对象之间不需要直接通信,减少了接口的复杂性。
- 支持广播消息:中介者可以作为消息中心,将事件或命令传递给多个感兴趣的同事类。
中介者模式的组成
- Mediator(抽象中介者接口/抽象类):定义了同事类用来与中介者通信的方法,如
send()
方法用于发送消息。 - ConcreteMediator(具体中介者):实现了
Mediator
接口,并维护了一份同事类的引用列表。它负责协调各个同事类之间的交互,当收到消息时会根据具体情况做出响应。 - Colleague(抽象同事类接口/抽象类):声明了一些方法供具体同事类实现,通常包括了一个指向中介者的引用,以便能够向中介者发送消息。
- ConcreteColleague(具体同事类):实现了
Colleague
接口,包含了自身的业务逻辑以及与其他同事类交互所需的逻辑。每个具体同事类都持有一个指向中介者的引用,用于发送消息或请求服务。
中介者模式的实现
我们将通过一个简单的例子来演示中介者模式的应用:假设我们正在开发一个聊天室应用程序,用户可以在其中发送消息给其他用户。我们可以使用中介者模式来管理用户之间的消息传递,确保用户之间不直接通信,而是通过聊天室这个中介者来进行交流。
示例代码
// 抽象中介者 - ChatRoom
interface ChatRoom {
void sendMessage(String message, User user);
}
// 具体中介者 - ConcreteChatRoom
class ConcreteChatRoom implements ChatRoom {
private final List<User> users = new ArrayList<>();
@Override
public void sendMessage(String message, User user) {
for (User u : users) {
if (u != user) { // 不给自己发消息
u.receive(message);
}
}
}
public void addUser(User user) {
users.add(user);
}
}
// 抽象同事类 - User
abstract class User {
protected ChatRoom chatRoom;
protected String name;
public User(ChatRoom chatRoom, String name) {
this.chatRoom = chatRoom;
this.name = name;
}
public abstract void send(String message);
public abstract void receive(String message);
}
// 具体同事类 - ConcreteUser
class ConcreteUser extends User {
public ConcreteUser(ChatRoom chatRoom, String name) {
super(chatRoom, name);
}
@Override
public void send(String message) {
System.out.println(this.name + ": Sending Message=" + message);
chatRoom.sendMessage(message, this);
}
@Override
public void receive(String message) {
System.out.println(this.name + ": Received Message:" + message);
}
}
使用示例
public class MediatorPatternDemo {
public static void main(String[] args) {
// 创建具体的中介者对象
ChatRoom chatRoom = new ConcreteChatRoom();
// 创建具体的同事类对象
User user1 = new ConcreteUser(chatRoom, "John");
User user2 = new ConcreteUser(chatRoom, "Jane");
User user3 = new ConcreteUser(chatRoom, "Jim");
// 将用户加入聊天室
chatRoom.addUser(user1);
chatRoom.addUser(user2);
chatRoom.addUser(user3);
// 模拟用户之间的消息传递
user1.send("Hi Everyone!");
user2.send("Hello John!");
}
}
中介者模式的应用场景
- 当你有一组对象,它们之间存在复杂的交互关系,但又不想让它们直接相互引用时。
- 如果希望将一组对象之间的交互逻辑集中在一个地方进行管理,以提高系统的可维护性和灵活性。
- 在GUI编程中,组件之间的协作往往非常复杂,中介者模式可以帮助组织这些交互。
- 对于那些具有“多对多”关系的对象群集,如社交网络中的好友互动、即时通讯软件中的群聊功能等,中介者模式提供了一种有效的解决方案。
- 实现事件驱动系统,例如发布-订阅模型,其中多个订阅者监听同一主题的变化。
结语
希望本文能帮助您更好地理解中介者模式的概念及其实际应用。如果您有任何疑问或建议,请随时留言交流。