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

Java 設計模式之中介者模式介紹

     編輯:Java 相關知識

中介者模式:用中介對象封裝對象間交互,降低耦合

中介者模式 屬於行為型模式。它用一個中介對象來封裝一系列對象之間的交互。中介者使各對象不需要顯式地相互引用,從而使其耦合鬆散,且可以獨立地改變它們之間的交互。

核心角色

  • Mediator (抽象中介者):定義同事對象通信接口。
  • ConcreteMediator (具體中介者):實現協調邏輯,持有同事對象引用。
  • Colleague (抽象同事類):持有中介者引用,定義交互方法。
  • ConcreteColleague (具體同事類):實現具體業務,通過中介者通信。

代碼範例:聊天室


// 1. 中介者接口
public interface ChatMediator {
    void sendMessage(String msg, User user);
    void addUser(User user);
}

// 2. 具體中介者
public class ChatRoom implements ChatMediator {
    private List users = new ArrayList<>();
    @Override public void addUser(User user) { users.add(user); }
    @Override
    public void sendMessage(String msg, User sender) {
        for (User u : users) {
            if (u != sender) { // 不發給自己
                u.receive(msg);
            }
        }
    }
}

// 3. 抽象同事類
public 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 msg);
    public abstract void receive(String msg);
}

// 4. 具體同事類
public class ChatUser extends User {
    public ChatUser(ChatMediator mediator, String name) { super(mediator, name); }
    @Override public void send(String msg) {
        System.out.println(name + " 發送: " + msg);
        mediator.sendMessage(msg, this);
    }
    @Override public void receive(String msg) {
        System.out.println(name + " 接收: " + msg);
    }
}

// 5. 客戶端
public class Client {
    public static void main(String[] args) {
        ChatMediator room = new ChatRoom();
        User alice = new ChatUser(room, "Alice");
        User bob = new ChatUser(room, "Bob");
        User charlie = new ChatUser(room, "Charlie");

        room.addUser(alice);
        room.addUser(bob);
        room.addUser(charlie);

        alice.send("Hello everyone!");
    }
}

模式優勢

  • 降低耦合:同事類只依賴中介者接口,不直接依賴其他同事類。N:N 依賴變為 1:N。
  • 集中控制交互邏輯:協調規則集中在中介者中,易於修改、擴展 (如添加過濾、日誌、權限)。
  • 符合迪米特法則:對象只與直接朋友 (中介者) 通信。

缺點

  • 中介者類可能變得臃腫複雜(「上帝類」風險),需拆分職責。

經典應用場景

  • GUI 組件交互:對話框中按鈕、輸入框、列表框相互影響 (如選中列表項啟用按鈕),中介者為 Dialog 類。
  • MVC 模式中的 Controller:View 和 Model 不直接通信,Controller 充當中介者。
  • 消息總線/事件總線:進程內 (Guava EventBus) 或分佈式 (Kafka) 中介者。
  • 航管系統:飛機之間不直接通信,通過塔台 (中介者) 協調。

與觀察者模式對比

觀察者模式:Subject 維護 Observer 列表,單向通知,關注「狀態變更通知」。
中介者模式:雙向交互,中介者包含具體協調邏輯,關注「對象間複雜交互協調」。

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