中介者模式基礎概念
中介者模式(Mediator Pattern)是一種行為型設計模式,其核心思想是通過一個中介對象來封裝一系列對象之間的交互,使各對象不需要顯式地相互引用,從而降低耦合度,并可以獨立地改變它們之間的交互。中介者模式將多對多的交互轉化為一對多的交互,集中控制對象間的通信。
中介者模式的核心組件
- 抽象中介者(Mediator)?- 定義中介者與同事對象之間的通信接口。
- 具體中介者(ConcreteMediator)?- 實現抽象中介者接口,協調各同事對象之間的交互,持有所有同事對象的引用。
- 抽象同事類(Colleague)?- 定義同事類的公共接口,每個同事對象都知道其中介者對象,并通過中介者進行通信。
- 具體同事類(ConcreteColleague)?- 實現抽象同事類,只知道中介者而不知道其他同事對象,通過中介者與其他同事通信。
中介者模式的實現
下面通過一個簡單的聊天室示例展示中介者模式的實現:
// 1. 抽象中介者
interface ChatMediator {void sendMessage(String message, User user);void addUser(User user);
}// 2. 具體中介者 - 聊天室
class ChatRoom implements ChatMediator {private List<User> users = new ArrayList<>();@Overridepublic void sendMessage(String message, User user) {// 中介者負責消息的轉發for (User u : users) {if (u != user) { // 不發送給自己u.receiveMessage(message);}}}@Overridepublic void addUser(User user) {users.add(user);}
}// 3. 抽象同事類 - 用戶
abstract class User {protected ChatMediator mediator;protected String name;public User(ChatMediator mediator, String name) {this.mediator = mediator;this.name = name;}public abstract void send(String message);public abstract void receiveMessage(String message);
}// 4. 具體同事類 - 普通用戶
class NormalUser extends User {public NormalUser(ChatMediator mediator, String name) {super(mediator, name);}@Overridepublic void send(String message) {System.out.println(name + " 發送消息: " + message);mediator.sendMessage(message, this); // 通過中介者發送消息}@Overridepublic void receiveMessage(String message) {System.out.println(name + " 收到消息: " + message);}
}// 5. 具體同事類 - VIP用戶
class VIPUser extends User {public VIPUser(ChatMediator mediator, String name) {super(mediator, name);}@Overridepublic void send(String message) {System.out.println("[VIP] " + name + " 發送消息: " + message);mediator.sendMessage("[VIP] " + message, this); // VIP消息添加特殊標識}@Overridepublic void receiveMessage(String message) {System.out.println(name + " 收到消息: " + message);}
}// 6. 客戶端代碼
public class MediatorPatternClient {public static void main(String[] args) {// 創建中介者ChatMediator chatRoom = new ChatRoom();// 創建同事對象User user1 = new NormalUser(chatRoom, "張三");User user2 = new NormalUser(chatRoom, "李四");User user3 = new VIPUser(chatRoom, "王五");// 將同事添加到中介者chatRoom.addUser(user1);chatRoom.addUser(user2);chatRoom.addUser(user3);// 發送消息user1.send("大家好!");System.out.println();user3.send("歡迎加入聊天室!");}
}
中介者模式的應用場景
- 系統中對象間依賴復雜?- 當對象間存在大量的相互引用和交互,導致依賴關系混亂時
- 集中控制交互?- 需要集中控制多個對象間的交互邏輯時
- MVC 架構?- 控制器(Controller)作為視圖(View)和模型(Model)的中介
- GUI 組件交互?- 如窗口中多個組件間的聯動
- 消息隊列系統?- 消息中間件作為生產者和消費者的中介
- 多人游戲?- 游戲服務器作為玩家之間的中介,處理消息轉發
中介者模式的優缺點
優點:
- 降低耦合度?- 對象間無需顯式引用,減少了對象間的依賴關系
- 集中控制交互?- 將交互邏輯集中在中介者中,便于維護和修改
- 符合開閉原則?- 可以在不修改現有同事類的情況下,通過擴展中介者類來新增交互方式
- 簡化對象協議?- 將多對多的交互轉化為一對多的交互,簡化了通信協議
- 便于復用?- 單個同事類可以在不同的中介者環境中復用
缺點:
- 中介者類膨脹?- 中介者承擔了過多的交互邏輯,可能變得復雜龐大
- 維護難度增加?- 中介者類的修改可能影響多個同事類,增加維護風險
- 系統響應變慢?- 所有交互都通過中介者,可能導致系統響應性能下降
- 違反單一職責原則?- 中介者類可能負責過多的功能,導致職責不清晰
- 調試困難?- 中介者中的交互邏輯可能復雜,導致調試困難
使用中介者模式的注意事項
- 控制中介者復雜度?- 避免中介者類過于龐大,可將部分邏輯分解為更小的組件
- 合理設計中介者接口?- 確保中介者接口清晰,不包含無關功能
- 避免過度使用?- 僅在對象間交互復雜且需要集中控制時使用中介者模式
- 與觀察者模式結合?- 中介者模式可以與觀察者模式結合,實現事件驅動的交互
- 考慮性能影響?- 對于高性能要求的系統,需謹慎使用中介者模式
- 測試中介者?- 由于中介者集中了大量邏輯,應對其進行充分測試
總結
中介者模式通過引入一個中介對象來封裝對象間的交互,將多對多的依賴關系轉化為一對多的關系,從而降低系統的耦合度,提高可維護性和可擴展性。它在需要集中控制對象交互的場景中尤為有用,如 GUI 系統、消息隊列、多人游戲等。合理使用中介者模式可以使系統結構更加清晰,但需注意控制中介者類的復雜度,避免其成為系統的瓶頸。