中介者模式(Mediator Pattern)是一种行为设计模式,它用于减少多个对象和类之间的直接交互复杂性,通过引入一个中介机构(即中介者)来管理这些交互。中介者模式定义了一个中心组件,该组件负责协调各对象之间的通信,使得对象之间不必显式地相互引用,从而降低了系统的耦合性并提高了可维护性和灵活性。
概念核心
- 中介者(Mediator):定义一个接口,用于同事对象之间的通信。中介者知道如何与各同事通信,如何将消息从一个同事转发给另一个同事。
- 同事(Colleague):每一个同事都知道中介者,并且直接与其他同事通信时,都是通过中介者进行。每个同事都不直接与其它同事通信,而是通过中介者间接通信,使得对象之间的耦合度降低。
适用场景
- 当一个系统中对象之间的交互复杂到难以理解,形成大量的相互关联时,可以使用中介者模式来整理这些交互。
- 当你想在不修改类的情况下,改变对象之间的交互时,可以使用中介者模式来集中控制交互逻辑。
- 在用户界面设计中,比如图形界面工具包,窗口、按钮、文本框等UI组件之间的交互可以通过中介者统一管理,简化组件之间的直接引用关系。
- 在多层架构中,业务逻辑层或数据访问层的各个模块间可以通过中介者进行解耦。
优缺点
优点:
- 减少了对象之间的耦合,使得对象易于独立复用。
- 将对象间的行为集中管理,便于修改和维护。
- 支持动态地改变同事对象间的交互关系。
缺点:
- 中介者会成为系统的瓶颈,所有交互都集中于此,如果设计不当可能造成中介者过于复杂。
- 如果同事对象间的交互很多,中介者的接口可能会非常庞大,难以管理。
实现要点
- 定义一个抽象中介者类,声明一个接口用于同事对象之间的通信。
- 实现具体中介者类,具体处理同事对象的交互逻辑。
- 同事对象持有中介者的引用,但不知道其他同事的存在,只通过中介者进行通信。
以下是一个使用Java实现的中介者模式示例。在这个例子中,我们将构建一个简单的聊天室模型,其中ChatRoom
作为中介者,负责协调不同User
(同事)之间的消息传递。
1. 创建中介者接口
首先,定义一个中介者接口,描述中介者的基本功能,即如何传递信息。
public interface ChatRoom {
void sendMessage(User user, String message);
}
2. 实现具体中介者 - 聊天室
然后,创建一个具体的中介者类ChatRoomImpl
,实现ChatRoom
接口。这个类将负责接收来自用户的消息,并将其广播给所有其他用户。
import java.util.ArrayList;
import java.util.List;
public class ChatRoomImpl implements ChatRoom {
private List<User> users = new ArrayList<>();
public void addUser(User user) {
users.add(user);
user.setChatRoom(this);
}
@Override
public void sendMessage(User user, String message) {
for (User u : users) {
if (u != user) {
u.receiveMessage(user.getName() + ": " + message);
}
}
}
}
3. 定义同事接口
定义一个同事接口,表示能发送和接收消息的基本能力。
public interface User {
void setChatRoom(ChatRoom chatRoom);
String getName();
void receiveMessage(String message);
}
4. 实现具体同事 - 用户
创建用户类,实现User
接口,每个用户都能发送消息并通过中介者接收消息。
public class UserImpl implements User {
private String name;
private ChatRoom chatRoom;
public UserImpl(String name) {
this.name = name;
}
@Override
public void setChatRoom(ChatRoom chatRoom) {
this.chatRoom = chatRoom;
}
@Override
public String getName() {
return name;
}
public void sendMessage(String message) {
chatRoom.sendMessage(this, message);
}
@Override
public void receiveMessage(String message) {
System.out.println(name + " received: " + message);
}
}
5. 客户端代码
最后,客户端代码创建中介者和同事对象,并模拟用户间的交流。
public class MediatorPatternDemo {
public static void main(String[] args) {
ChatRoom chatRoom = new ChatRoomImpl();
User alice = new UserImpl("Alice");
User bob = new UserImpl("Bob");
chatRoom.addUser(alice);
chatRoom.addUser(bob);
alice.sendMessage("Hi Bob, how are you?");
bob.sendMessage("I'm good, thanks Alice! How about you?");
}
}
在这个示例中,ChatRoomImpl
作为中介者管理着多个用户的通信,用户之间不直接相互通信,而是通过聊天室来传递消息,这减少了用户之间的耦合度,同时也方便在未来添加新的通信逻辑或者用户类型,提高了系统的灵活性和可维护性。