深入理解設計模式之:中介者模式(Mediator Pattern)
一、什么是中介者模式?
中介者模式(Mediator Pattern)是一種行為型設計模式。它通過引入一個中介對象,來封裝一組對象之間的交互,使對象之間不再直接引用彼此,而是通過中介者進行通信,從而降低對象之間的耦合度,便于系統的擴展和維護。
核心思想:
將對象之間復雜的網狀關系變為星型結構,所有對象只與中介者交互。
二、應用場景
- GUI 界面組件之間的交互(如按鈕、文本框、下拉框等)
- 聊天室、消息總線、事件總線
- 機場調度、交通信號燈等需要統一協調的場景
- Spring ApplicationContext、事件發布機制
三、模式結構
- Mediator(抽象中介者):定義同事對象之間通信的接口
- ConcreteMediator(具體中介者):實現協調各同事對象的通信
- Colleague(同事類):各參與交互的對象,持有中介者引用
四、UML 類圖
+-------------------+
| Mediator |<-------------------+
+-------------------+ |
| +notify() | |
+-------------------+ |/_\ || |
+---------------------+ +---------------------+
| ConcreteMediator | | Colleague |
+---------------------+ +---------------------+
| +notify() | | mediator: Mediator |
| +register() | | +send() |
+---------------------+ | +receive() |+---------------------+/_\|+----------------+----------------+| |+-------------------+ +-------------------+| ColleagueA | | ColleagueB |+-------------------+ +-------------------+
五、Java 實現代碼示例
1. 抽象中介者
public interface Mediator {void send(String message, Colleague colleague);
}
2. 抽象同事類
public abstract class Colleague {protected Mediator mediator;public Colleague(Mediator mediator) {this.mediator = mediator;}
}
3. 具體同事類
public class ColleagueA extends Colleague {public ColleagueA(Mediator mediator) {super(mediator);}public void send(String message) {System.out.println("ColleagueA 發送消息: " + message);mediator.send(message, this);}public void receive(String message) {System.out.println("ColleagueA 收到消息: " + message);}
}public class ColleagueB extends Colleague {public ColleagueB(Mediator mediator) {super(mediator);}public void send(String message) {System.out.println("ColleagueB 發送消息: " + message);mediator.send(message, this);}public void receive(String message) {System.out.println("ColleagueB 收到消息: " + message);}
}
4. 具體中介者
public class ConcreteMediator implements Mediator {private ColleagueA colleagueA;private ColleagueB colleagueB;public void setColleagueA(ColleagueA colleagueA) {this.colleagueA = colleagueA;}public void setColleagueB(ColleagueB colleagueB) {this.colleagueB = colleagueB;}@Overridepublic void send(String message, Colleague colleague) {if (colleague == colleagueA) {colleagueB.receive(message);} else if (colleague == colleagueB) {colleagueA.receive(message);}}
}
5. 客戶端調用
public class Main {public static void main(String[] args) {ConcreteMediator mediator = new ConcreteMediator();ColleagueA a = new ColleagueA(mediator);ColleagueB b = new ColleagueB(mediator);mediator.setColleagueA(a);mediator.setColleagueB(b);a.send("你好,B!");b.send("你好,A!");}
}
輸出:
ColleagueA 發送消息: 你好,B!
ColleagueB 收到消息: 你好,B!
ColleagueB 發送消息: 你好,A!
ColleagueA 收到消息: 你好,A!
六、優缺點
優點:
- 降低對象之間的耦合度,便于擴展和維護
- 集中管理對象間的交互,邏輯清晰
- 易于增加新同事類和中介者
缺點:
- 中介者可能變得過于復雜,成為“上帝類”
- 過多的中介邏輯可能影響性能和可維護性
七、實際應用舉例
- 聊天室中的消息轉發
- GUI 組件事件協調
- Spring 事件發布機制
- 業務流程編排引擎
八、總結
中介者模式是解耦對象間復雜交互的有效手段,適合多對象協作、交互復雜的場景。掌握中介者模式有助于編寫高內聚、低耦合的系統架構。
建議:
- 適用于對象間交互復雜、變化頻繁的系統
- 注意中介者的復雜度,避免成為“上帝類”
如需更多設計模式講解或源碼分析,歡迎留言交流!