1. 引言
在复杂的软件系统中,通常存在许多对象之间的相互关系和通信,这种直接的交流方式可能会导致系统的耦合度增加,维护也变得困难。中介者模式(Mediator Pattern)通过引入一个中介对象,来降低对象之间的耦合度,从而简化对象间的通信。在这个模式下,各个对象不再直接引用彼此,而是通过中介者进行交互。
2. 中介者模式的定义
中介者模式是一种行为型设计模式,它定义了一个中介对象,通过中介对象来封装对象之间的交互。中介者使得各个对象之间的关系更加松散,提高了系统的灵活性和可维护性。
3. 适用场景
- 当系统中存在多个对象之间需要相互通信的情况,但又希望降低它们之间的耦合度时。
- 当希望通过中介者集中管理和控制对象之间的交互时。
- 当需要增强系统的可扩展性,方便后期增加新的组件或进行修改时。
4. 结构
中介者模式主要包括以下角色:
- 中介者接口(Mediator):定义与各个组件交互的接口。
- 具体中介者(ConcreteMediator):实现中介者接口,协调各个组件的交互。
- 同事类(Colleague):定义与中介者交互的接口,具体实现由子类定义。
- 具体同事类(ConcreteColleague):实现同事类接口,注册到中介者并通过中介者进行交互。
5. 示例代码
5.1 中介者接口
// 中介者接口
interface Mediator {
void register(Colleague colleague);
void mediate(Colleague colleague, String message);
}
DiffCopyInsert
5.2 具体中介者
import java.util.ArrayList;
import java.util.List;
// 具体中介者
class ConcreteMediator implements Mediator {
private List<Colleague> colleagues = new ArrayList<>();
@Override
public void register(Colleague colleague) {
colleagues.add(colleague);
colleague.setMediator(this);
}
@Override
public void mediate(Colleague colleague, String message) {
for (Colleague c : colleagues) {
if (c != colleague) {
c.receive(message);
}
}
}
}
DiffCopyInsert
5.3 同事类
// 同事类
abstract class Colleague {
protected Mediator mediator;
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
public abstract void send(String message);
public abstract void receive(String message);
}
DiffCopyInsert
5.4 具体同事类
// 具体同事类A
class ConcreteColleagueA extends Colleague {
@Override
public void send(String message) {
System.out.println("同事A发送消息: " + message);
mediator.mediate(this, message);
}
@Override
public void receive(String message) {
System.out.println("同事A接收到消息: " + message);
}
}
// 具体同事类B
class ConcreteColleagueB extends Colleague {
@Override
public void send(String message) {
System.out.println("同事B发送消息: " + message);
mediator.mediate(this, message);
}
@Override
public void receive(String message) {
System.out.println("同事B接收到消息: " + message);
}
}
DiffCopyInsert
5.5 客户端代码
public class MediatorPatternDemo {
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
ConcreteColleagueA colleagueA = new ConcreteColleagueA();
ConcreteColleagueB colleagueB = new ConcreteColleagueB();
mediator.register(colleagueA);
mediator.register(colleagueB);
colleagueA.send("你好,B!");
colleagueB.send("你好,A!");
}
}
DiffCopyInsert
6. 优缺点
6.1 优点
- 降低了耦合度:中介者模式通过中介者管理对象间的交互,减少了对象之间的直接引用和依赖关系。
- 易于维护和扩展:通过中介者可以简化对象间的通讯逻辑,便于在不修改现有类的情况下增加新行为。
- 集中的控制:中介者集中管理了对象之间的通信,便于调试和控制。
6.2 缺点
- 中介者可能成为复杂的“上帝”对象:由于中介者承担了太多的责任,可能导致它的复杂性增加。
- 难以理解:对于不熟悉模式的开发者,中介者的逻辑可能会变得难以理解,尤其是在系统较大时。
7. 总结
中介者模式是一种有效的设计模式,通过引入中介者对象,能够解耦对象之间的直接交互,简化系统结构。在实际开发中,合理使用中介者模式,可以提升代码的动态性和可维护性,尤其在复杂的对象之间交互时。它适用于需要集中管理多个组件之间的交互的场景,为系统带来了更好的灵活性和可扩展性。