跳转到内容

中介者 (Mediator)

中介者 (Mediator) 是一种行为型设计模式,用中介对象封装一组对象间的交互,使各对象不必相互引用,从而降低耦合、便于独立复用与修改。

  • 多个对象相互引用、直接通信,形成网状依赖,修改一个会波及多个。
  • 希望把“谁和谁如何协作”集中到一处管理。
  • 中介者 (Mediator):定义与各同事 (Colleague) 交互的接口,负责转发、协调请求。
  • 具体中介者:持有各同事的引用,实现协调逻辑;同事只与中介者通信,不直接引用其他同事。
  • 同事类:持有中介者引用,发生事件时通知中介者,由中介者决定通知谁。客户端组装中介者与同事并注入引用。
classDiagram
    class Mediator {
        <<interface>>
        +notify(sender, event)* void
    }
    class ConcreteMediator {
        -colleagueA Colleague
        -colleagueB Colleague
        +notify(sender, event) void
    }
    class Colleague {
        #mediator Mediator
        +onEvent(event) void
    }
    class ConcreteColleagueA {
        +onEvent(event) void
    }
    Mediator <|.. ConcreteMediator
    Colleague <|-- ConcreteColleagueA
    ConcreteMediator o-- Colleague
    Colleague o-- Mediator
public interface Mediator {
void notify(Object sender, String event);
}
public abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator m) { this.mediator = m; }
}
public class ConcreteColleagueA extends Colleague {
public ConcreteColleagueA(Mediator m) { super(m); }
public void doSomething() {
mediator.notify(this, "A-done");
}
}
public class ConcreteMediator implements Mediator {
private ConcreteColleagueA a;
public void setColleagueA(ConcreteColleagueA a) { this.a = a; }
@Override
public void notify(Object sender, String event) {
if ("A-done".equals(event)) {
System.out.println("Mediator 收到 A 完成,可通知 B");
}
}
}
ConcreteMediator med = new ConcreteMediator();
ConcreteColleagueA a = new ConcreteColleagueA(med);
med.setColleagueA(a);
a.doSomething();

中介者把多对象间的交互集中到中介类,减少对象间直接依赖,适合对话框、聊天室、事件总线等场景。