中介者模式是一种行为设计模式,它允许对象之间通过一个中介者对象进行交互,而不是直接相互引用,从而降低耦合度。中介者模式很好地实现了 “松耦合” 的设计原则。
结构
- 中介者接口(Mediator): 定义了对象之间交互的方法,各个具体的中介者类实现这些方法。
public interface Mediator {
void sendMessage(String message, Colleague colleague);
}
- 具体中介者类(Concrete Mediator): 实现了中介者接口,负责协调各个同事对象之间的交互。
public class ConcreteMediator implements Mediator {
private Colleague colleague1;
private Colleague colleague2;
public void setColleague1(Colleague colleague1) {
this.colleague1 = colleague1;
}
public void setColleague2(Colleague colleague2) {
this.colleague2 = colleague2;
}
public void sendMessage(String message, Colleague colleague) {
if (colleague == colleague1) {
colleague2.receiveMessage(message);
} else {
colleague1.receiveMessage(message);
}
}
}
- 同事类(Colleague): 每个同事类知道它的中介者对象,并且与中介者通信。
public abstract class Colleague {
private Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
public void sendMessage(String message) {
mediator.sendMessage(message, this);
}
public abstract void receiveMessage(String message);
}
优点和缺点
优点:
- 降低了对象之间的耦合度: 对象之间不再直接引用其他对象,而是通过中介者进行通信,降低了对象之间的耦合度。
- 集中控制交互逻辑: 中介者模式集中了对象之间的交互逻辑,使得交互变得更加集中和可控。
- 易于扩展: 可以新增具体的中介者类和同事类,而无需修改已有的代码。
缺点:
- 中介者过于复杂: 如果中介者的逻辑过于复杂,可能会变得难以维护和理解。
示例
考虑一个聊天室的例子。聊天室中有多个用户(同事类),它们可以相互发送消息,但是不直接连接到彼此。中介者(聊天室)负责接收每个用户的消息并将消息发送给其他用户。
public class Main {
public static void main(String[] args) {
Mediator chatRoom = new ConcreteMediator();
Colleague user1 = new User(chatRoom, "User 1");
Colleague user2 = new User(chatRoom, "User 2");
chatRoom.setColleague1(user1);
chatRoom.setColleague2(user2);
user1.sendMessage("Hello, User 2!");
user2.sendMessage("Hi, User 1!");
}
}
在这个例子中,User 是同事类,ConcreteMediator 是具体中介者类。用户通过中介者对象 chatRoom 发送消息,中介者负责将消息发送给其他用户。这样,用户之间的通信通过中介者实现,而不是直接连接到彼此。