行为模式5.中介者模式-聊天室收发消息
行为型模式
- 模板方法模式(Template Method Pattern)
- 命令模式(Command Pattern)
- 迭代器模式(Iterator Pattern)
- 观察者模式(Observer Pattern)
- 中介者模式(Mediator Pattern)
- 备忘录模式(Memento Pattern)
- 解释器模式(Interpreter Pattern)
- 状态模式(State Pattern)
- 策略模式(Strategy Pattern)
- 职责链模式(Chain of Responsibility Pattern)
- 访问者模式(Visitor Pattern)
概述
中介者模式是一种行为设计模式,它定义了一个对象,用来封装一组对象之间的交互。中介者模式通过使对象之间的交互集中化,从而减少了对象之间的直接依赖关系。这样,减少了类与类之间的耦合性,使得它们之间的交互变得更加清晰和可维护。
在中介者模式中,所有对象通过中介者对象来进行交互,而不是直接相互联系。中介者通过协调各个对象的行为来实现它们之间的协作。
关键组成
- Mediator(中介者):定义一个接口,用于与各个同事对象进行交互。
- ConcreteMediator(具体中介者):实现
Mediator
接口,协调各个同事对象之间的交互。 - Colleague(同事):每个同事对象都知道中介者,并通过中介者与其他同事对象进行通信。
- ConcreteColleague(具体同事):实现
Colleague
接口,代表具体的同事类。
优点
- 减少类之间的依赖:对象不再直接引用其他对象,而是通过中介者进行交互,降低了耦合度。
- 集中化控制:所有的交互行为由中介者控制,代码更易于管理和扩展。
- 易于扩展:新增同事类时,基本上不需要修改原有代码,符合开闭原则。
缺点
- 中介者复杂化:中介者角色可能变得过于庞大,变得难以管理。
- 单一职责违反:一个中介者可能处理过多不同对象的交互,导致职责不单一。
适用场景
- 多个对象之间存在复杂的交互关系。
- 希望通过减少对象间直接通信来降低耦合度。
- 希望集中控制对象间的交互逻辑。
Java 示例代码
假设我们有一个聊天室系统,多个用户(同事)可以在聊天室中发送和接收消息,但每个用户不直接与其他用户通信,而是通过一个中介者来协调消息的发送与接收。
// Mediator (中介者接口)
interface ChatMediator {
void sendMessage(String message, User user);
void addUser(User user);
}
// ConcreteMediator (具体中介者)
class ChatRoom implements ChatMediator {
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);
}
}
// Colleague (同事接口)
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);
}
// ConcreteColleague (具体同事)
class ConcreteUser extends User {
public ConcreteUser(ChatMediator mediator, String name) {
super(mediator, name);
}
@Override
public void send(String message) {
System.out.println(this.name + " sends message: " + message);
mediator.sendMessage(message, this);
}
@Override
public void receive(String message) {
System.out.println(this.name + " receives message: " + message);
}
}
// 客户端代码示例
public class MediatorPatternExample {
public static void main(String[] args) {
// 创建中介者对象(聊天室)
ChatMediator chatRoom = new ChatRoom();
// 创建具体用户并加入聊天室
User user1 = new ConcreteUser(chatRoom, "Alice");
User user2 = new ConcreteUser(chatRoom, "Bob");
User user3 = new ConcreteUser(chatRoom, "Charlie");
chatRoom.addUser(user1);
chatRoom.addUser(user2);
chatRoom.addUser(user3);
// 用户发送消息
user1.send("Hello, everyone!");
user2.send("Hi Alice!");
user3.send("Hey all!");
}
}