在软件开发中,随着系统的复杂性增加,对象之间的交互关系可能会变得非常复杂。当多个对象之间存在过多的直接依赖时,系统的可维护性和扩展性将大大降低。中介者设计模式(Mediator Pattern)就是为了解决这一问题而设计的,它通过引入一个中介对象,来简化各对象之间的交互,减少对象之间的直接依赖,提升系统的灵活性和可扩展性。
一、模式介绍
1.1 中介者模式的定义
中介者模式是一种行为型设计模式,它定义了一个中介对象,用于封装一组对象之间的交互。通过中介者,多个对象不再相互引用,而是通过中介者进行通信,从而达到降低耦合的目的。
中介者模式的核心思想是将多个对象之间的复杂通信逻辑集中到一个中介者对象中,避免了对象之间的直接依赖关系,使对象的关系结构变得简单且可控。
1.2 适用场景
中介者模式非常适用于以下场景:
-
对象之间存在复杂的依赖关系:当系统中对象之间的交互非常复杂,多个对象之间相互依赖时,可以使用中介者模式,将复杂的依赖关系转移到中介者中。
-
系统需要维护或扩展时:当系统需要增加新功能时,如果不想修改现有的对象交互逻辑,中介者可以帮助添加新功能而不影响现有对象。
-
多个组件之间的通信:比如UI系统中多个组件的相互交互,中介者模式可以管理这些组件之间的通信,避免组件直接相互依赖。
1.3 典型场景
-
聊天室应用:在一个聊天室中,用户之间不直接通信,而是通过聊天室(中介者)来传递消息。这样,无论有多少个用户参与,彼此都不需要知道对方的存在,只需要通过聊天室来传递消息即可。
-
航交通信系统:在航空系统中,飞机之间不直接进行通信,而是通过航管中心(中介者)来协调航班之间的互动。
-
MVC架构中的Controller:Controller作为中介者,协调Model和View之间的交互,而Model和View不直接通信。
二、架构设计
2.1 类图
在中介者模式中,类的设计主要包括以下几个核心组成部分:
-
Mediator(中介者):中介者接口,定义了同事对象之间交互的方式。
-
ConcreteMediator(具体中介者):实现了中介者接口,负责协调多个同事对象的交互逻辑。
-
Colleague(同事类):定义同事对象的抽象类,所有的同事对象都通过中介者进行通信。
-
ConcreteColleague(具体同事类):具体的同事类,它们的交互是通过中介者完成的,而不是相互之间直接交互。
类图:
三、Demo示例
下面是一个简单的Java例子,通过聊天室来展示中介者模式的应用。
// 1. 定义中介者接口
interface ChatMediator {
void sendMessage(String msg, User user);
void addUser(User user);
}
// 2. 实现具体的中介者类
class ChatRoomMediator implements ChatMediator {
private List<User> users = new ArrayList<>();
@Override
public void addUser(User user) {
this.users.add(user);
}
@Override
public void sendMessage(String msg, User user) {
for (User u : this.users) {
// 消息不会发送给自己
if (u != user) {
u.receive(msg);
}
}
}
}
// 3. 定义同事类
abstract class User {
protected ChatMediator mediator;
protected String name;
public User(ChatMediator mediator, String name) {
this.mediator = mediator;
this.name = name;
}
public abstract void send(String message);
public abstract void receive(String message);
}
// 4. 具体同事类
class ChatUser extends User {
public ChatUser(ChatMediator mediator, String name) {
super(mediator, name);
}
@Override
public void send(String message) {
System.out.println(this.name + " 发送消息: " + message);
mediator.sendMessage(message, this);
}
@Override
public void receive(String message) {
System.out.println(this.name + " 收到消息: " + message);
}
}
// 5. 使用中介者模式
public class MediatorPatternDemo {
public static void main(String[] args) {
ChatMediator mediator = new ChatRoomMediator();
User user1 = new ChatUser(mediator, "Alice");
User user2 = new ChatUser(mediator, "Bob");
User user3 = new ChatUser(mediator, "Charlie");
mediator.addUser(user1);
mediator.addUser(user2);
mediator.addUser(user3);
user1.send("Hello everyone!");
user2.send("Hey Alice!");
}
}
3.1 Demo解析
-
ChatMediator 是中介者接口,定义了发送消息和添加用户的行为。
-
ChatRoomMediator 是具体的中介者,负责将消息从一个用户转发给其他用户。
-
User 是抽象的同事类,表示需要通过中介者进行通信的用户。
-
ChatUser 是具体的同事类,实现了发送和接收消息的逻辑。
通过该示例,可以看到多个用户之间通过中介者进行消息传递,而不是直接通信,从而简化了交互逻辑。
四、总结
中介者设计模式通过引入一个中介者对象来简化对象之间的交互,降低了对象之间的耦合度。在复杂的系统中,它有效地减少了对象之间的依赖,使系统的扩展和维护更加容易。通过将对象间的通信集中到中介者中,我们可以轻松添加或修改通信规则,而不会影响系统中的其他部分。
总的来说,中介者模式是一种强大的设计模式,尤其适用于对象之间交互复杂、依赖关系多的场景。它不仅简化了代码结构,还提升了代码的可维护性和灵活性。