中介者 (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
Java 示例
Section titled “Java 示例”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();中介者把多对象间的交互集中到中介类,减少对象间直接依赖,适合对话框、聊天室、事件总线等场景。