中介者模式:用一個中介者對象封裝一系列對象交互,使各對象不顯式相互引用,從而鬆耦合,且可獨立改變交互行為。別名:調解者模式。
網狀結構 → 星型結構
abstract class AbstractColleague {
protected AbstractMediator mediator;
public void setMediator(AbstractMediator mediator) { this.mediator = mediator; }
}
class ColleagueA extends AbstractColleague {
public void self() { System.out.println("同事A做自己的事"); }
public void out() {
System.out.println("同事A請求同事B協作");
mediator.execute("ColleagueB", "self"); // 通過中介者轉發
}
}
class ColleagueB extends AbstractColleague {
public void self() { System.out.println("同事B做自己的事"); }
public void out() {
System.out.println("同事B請求同事A協作");
mediator.execute("ColleagueA", "self");
}
}
abstract class AbstractMediator {
protected Map<String, AbstractColleague> colleagues = new HashMap<>();
public void addColleague(String name, AbstractColleague c) {
c.setMediator(this); // 關鍵:中介者幫同事注冊自己
colleagues.put(name, c);
}
public abstract void execute(String name, String method);
}
class Mediator extends AbstractMediator {
public void execute(String name, String method) {
AbstractColleague c = colleagues.get(name);
if ("self".equals(method)) c.self();
else c.out(); // 簡化:實際可用反射或策略模式擴展
}
}
AbstractMediator m = new Mediator();
ColleagueA a = new ColleagueA(); ColleagueB b = new ColleagueB();
m.addColleague("ColleagueA", a); m.addColleague("ColleagueB", b);
a.self(); a.out(); // A做事 → A請B做事 → B做事
execute(),違反單一職責,成為「上帝類」setMediator而非構造器注入,避免循環依賴中介者模式以空間換時間、以集中換分散:犧牲中介者複雜度,換取同事類的純粹與復用。現代架構常用事件驅動/消息總線替代傳統中介者,本質相同——**建立間接層打破直接耦合**。理解其權衡藝術,是架構師進階關鍵。