首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 中介者模式深度解析:從網狀耦合到星型解老的架構重構

     編輯:Java 相關知識

模式定義

中介者模式:用一個中介者對象封裝一系列對象交互,使各對象不顯式相互引用,從而鬆耦合,且可獨立改變交互行為。別名:調解者模式。

核心角色

  • Mediator(抽象中介者):定義同事類通訊介面
  • ConcreteMediator(具體中介者):實現協調邏輯,持有同事引用
  • Colleague(抽象同事類):持有中介者引用,定義交互方法
  • ConcreteColleague(具體同事類):實現自身業務,通過中介者協作

為什麼需要中介者?

網狀結構 → 星型結構

  • 無中介者:N 個同事類雙向引用,修改一個影響多個,**過度耦合**,難復用、難維護
  • 有中介者:同事類只依賴中介者,修改局限於自身與中介者,**耦合度大幅降低**

完整代碼實戰:同事協作系統

1. 抽象同事類

abstract class AbstractColleague {
    protected AbstractMediator mediator;
    public void setMediator(AbstractMediator mediator) { this.mediator = mediator; }
}

2. 具體同事 A/B


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");
    }
}

3. 抽象/具體中介者


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(); // 簡化:實際可用反射或策略模式擴展
    }
}

4. 客戶端測試


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(),違反單一職責,成為「上帝類」
  • 擴展困難:新增同事類需修改中介者代碼(違反開閉原則)
  • 抽象同事類難提煉:業務差異大時難以提取共同介面

改良方向

  • 中介者內部採用策略模式/命令模式分發具體協作邏輯
  • 引入事件總線(如 Guava EventBus、Spring Event)替代中心化中介者,實現完全解耦
  • 同事類註冊改為setMediator而非構造器注入,避免循環依賴

適用場景

  • 多組件複雜交互(如航管系統、智能家居中控、MVC 控制器)
  • 組件復用受限於相互依賴
  • 交互邏輯頻繁變更,需集中維護

總結

中介者模式以空間換時間、以集中換分散:犧牲中介者複雜度,換取同事類的純粹與復用。現代架構常用事件驅動/消息總線替代傳統中介者,本質相同——**建立間接層打破直接耦合**。理解其權衡藝術,是架構師進階關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved