中介者模式用一個中介對象封裝一組對象的交互,將網狀依賴轉為星狀結構。本文以「跨部門協作」為例,展示部門間通過中介者協調,而非直接耦合,附迪米特法則合規性分析與 MVC 中 Controller 作為中介者的架構映射。
N 個部門兩兩可能交互 → N×(N-1) 條依賴關係。新增部門需修改所有相關部門代碼,維護噩夢。
// 同事類:部門
class Department {
private String name;
private Mediator mediator;
public Department(Mediator mediator, String name) {
this.mediator = mediator; this.name = name;
}
// 發起請求
public void request(String task, String targetDeptKey) {
System.out.println("[" + name + "] 需要協助:" + task);
mediator.coordinate(this, task, targetDeptKey);
}
// 處理請求
public void handle(String fromDept, String task) {
System.out.println("[" + name + "] 收到 " + fromDept + " 請求:" + task + " → 立即處理");
System.out.println("-----------------------------------");
}
}
// 中介者:協調中心
class Mediator {
private Map<String, Department> depts = new HashMap<>();
public void register(Department dept, String key) { depts.put(key, dept); }
public void coordinate(Department from, String task, String targetKey) {
Department target = depts.get(targetKey);
if (target != null) target.handle(from.name, task);
}
}
// 客戶端
public class Demo {
public static void main(String[] args) {
Mediator m = new Mediator();
Department dev = new Department(m, "開發部");
Department fin = new Department(m, "財務部");
Department ops = new Department(m, "運營部");
m.register(dev, "dev");
m.register(fin, "fin");
m.register(ops, "ops");
fin.request("專案需要開發資源", "dev"); // 財務 → 開發
dev.request("開發完成需資金支持", "fin"); // 開發 → 財務
dev.request("上線需要運營配合", "ops"); // 開發 → 運營
ops.request("宣傳需要預算", "fin"); // 運營 → 財務
}
}
| 維度 | 中介者 | 代理 |
|---|---|---|
| 核心目的 | 協調多對象交互,化網狀為星狀 | 控制對目標對象訪問,隱藏細節 |
| 對象關係 | 多對多 → 一對多(中介者) | 一對一(代理 → 真實對象) |
| 知曉範圍 | 中介者知曉所有同事 | 代理知曉真實對象 |
| 典型場景 | MVC Controller、事件總線、航管塔台 | 遠程代理、虛擬代理、保護代理 |
中介者模式是「降低耦合」的強力工具,適用於交互複雜、參與者多變的協作場景。