这是我参与「掘金日新计划 · 2 月更文挑战」的第 28 天,点击查看活动详情
系列文章|源码
定义-是什么
中介者模式(Mediator Pattern)是一种行为型设计模式,又称为调解者模式或调停者模式,它允许对象间通过一个中介者对象来相互通信,而不需要直接相互引用。中介者模式将对象间的交互关系集中在一个中介者对象中,从而降低了对象间的耦合度,使得对象间的关系更加灵活。
在中介者模式中,中介者对象充当了对象间通信的“中心枢纽”,所有对象都和中介者对象进行通信,而不是直接和其他对象进行通信。中介者对象负责协调对象间的通信和交互,它通过封装对象间的通信行为来降低对象间的耦合度,使得对象间的关系更加灵活。
中介者模式适用于对象间的交互关系比较复杂,对象间存在大量的交互行为的情况。使用中介者模式可以将对象间的交互行为抽象出来,从而使得系统更加灵活和可维护。
举个例子,假设有一个聊天室系统,其中有多个用户参与聊天。如果使用中介者模式,可以将聊天室对象作为中介者对象,所有用户都通过聊天室对象来发送和接收消息,而不是直接和其他用户进行通信。这样可以降低用户间的耦合度,使得系统更加灵活和可扩展。
意图:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。
思考-为什么
优点
- 降低了系统中对象间的耦合度,减少了对象间的直接交互,使得系统更加灵活和可扩展。
- 中介者对象作为系统的中心枢纽,可以更加方便地对系统进行管理和维护。
- 可以避免多个对象之间产生复杂的依赖关系,使得对象间的关系更加简单和清晰。
- 可以将系统分成多个模块,每个模块只需要关注自己的业务逻辑,从而提高系统的可维护性和可扩展性。
缺点
- 中介者对象作为系统的中心枢纽,可能会变得过于复杂,难以管理和维护。
- 可能会导致系统的性能下降,因为所有的对象都需要通过中介者对象来通信,而中介者对象需要处理大量的消息。
- 可能会导致系统的扩展性下降,因为新增一个对象时,可能需要修改中介者对象的代码,从而增加了系统的复杂度。
综合考虑,中介者模式适用于系统中对象间的交互关系比较复杂,对象间存在大量的交互行为的情况,而不适用于对象间的交互关系比较简单的情况。在实际应用中,需要根据具体的情况来选择是否使用中介者模式。
应用-怎么用
在 Java 中实现中介者模式,一般可以按照以下步骤进行:
- 定义中介者接口(Mediator),该接口声明了中介者对象必须实现的方法,用于接收和转发对象间的消息。
public interface Mediator {
void sendMessage(String message, Colleague colleague);
}
- 定义抽象同事类(Colleague),该类包含了一个中介者对象,用于发送和接收消息,以及一个抽象方法,用于处理接收到的消息。
public abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
public abstract void receiveMessage(String message);
public void sendMessage(String message) {
mediator.sendMessage(message, this);
}
}
- 定义具体同事类(ConcreteColleague),该类实现了抽象同事类中定义的方法,用于发送和接收消息。
public class ConcreteColleague extends Colleague {
public ConcreteColleague(Mediator mediator) {
super(mediator);
}
@Override
public void receiveMessage(String message) {
System.out.println("ConcreteColleague received message: " + message);
}
}
- 定义具体中介者类(ConcreteMediator),该类实现了中介者接口中定义的方法,用于接收和转发对象间的消息。
public class ConcreteMediator implements Mediator {
private List<Colleague> colleagues;
public ConcreteMediator() {
colleagues = new ArrayList<>();
}
public void addColleague(Colleague colleague) {
colleagues.add(colleague);
}
@Override
public void sendMessage(String message, Colleague colleague) {
for (Colleague c : colleagues) {
if (c != colleague) {
c.receiveMessage(message);
}
}
}
}
- 在客户端代码中创建具体同事类和具体中介者类的对象,并将同事对象注册到中介者对象中。
public class Client {
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
ConcreteColleague colleague1 = new ConcreteColleague(mediator);
ConcreteColleague colleague2 = new ConcreteColleague(mediator);
mediator.addColleague(colleague1);
mediator.addColleague(colleague2);
colleague1.sendMessage("Hello, colleague2!");
colleague2.sendMessage("Hi, colleague1!");
}
}
在上述代码中,首先创建了一个具体中介者类的对象 ConcreteMediator,然后创建了两个具体同事类的对象 ConcreteColleague,并将它们注册到中介者对象中。最后,通过具体同事类的对象向其他同事对象发送消息,中介者对象会接收并转发消息给其他同事对象。