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

Java 設計模式:中介者模式 解耦同事對象交互

     編輯:Java 程式設計入門

模式定義

用一個中介者對象封裝一系列對象之間的交互。中介者使各對象不需要顯式相互引用,從而降低耦合,且能獨立改變交互邏輯。

角色結構

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

案例:生產者-消費者-代理商平台

// 抽象中介者
interface Mediator {
    void registerProducer(Producer p);
    void registerConsumer(Consumer c);
    void notify(String event, Object data);
}

// 具體中介者
class TradeMediator implements Mediator {
    private Producer producer;
    private List consumers = new ArrayList<>();

    public void registerProducer(Producer p) { this.producer = p; }
    public void registerConsumer(Consumer c) { consumers.add(c); }

    public void notify(String event, Object data) {
        switch (event) {
            case "NEW_PRODUCT":
                consumers.forEach(c -> c.onNewProduct((Product) data));
                break;
            case "ORDER_PLACED":
                producer.onOrderReceived((Order) data);
                break;
        }
    }
}

// 抽象同事
abstract class Colleague {
    protected Mediator mediator;
    public Colleague(Mediator m) { this.mediator = m; }
}

// 具體同事:生產者
class Producer extends Colleague {
    public Producer(Mediator m) { super(m); mediator.registerProducer(this); }
    public void releaseProduct(Product p) { mediator.notify("NEW_PRODUCT", p); }
    public void onOrderReceived(Order o) { System.out.println("收到訂單: " + o); }
}

// 具體同事:消費者
class Consumer extends Colleague {
    private String name;
    public Consumer(Mediator m, String name) { super(m); this.name = name; mediator.registerConsumer(this); }
    public void onNewProduct(Product p) { System.out.println(name + " 收到新品: " + p); }
    public void placeOrder(Product p) { mediator.notify("ORDER_PLACED", new Order(this, p)); }
}

// 客戶端
public class MediatorDemo {
    public static void main(String[] args) {
        Mediator mediator = new TradeMediator();
        Producer producer = new Producer(mediator);
        Consumer c1 = new Consumer(mediator, "消費者A");
        Consumer c2 = new Consumer(mediator, "消費者B");

        producer.releaseProduct(new Product("iPhone 15"));
        c1.placeOrder(new Product("iPhone 15"));
    }
}

優缺點分析

優點缺點
同事類解耦,單一職責中介者可能膨脹成「上帝類」,邏輯過於集中
集中管理交互邏輯,易維護新增同事類需修改中介者 (違反開閉原則),可用觀察者模式輔助
可獨立複用同事類間接通訊增加效能開銷 (通常可忽略)

應用場景

  • GUI 元件協調 (對話框中按鈕/輸入框/列表聯動) → JDialog 充當中介者。
  • 航空管制系統、交易撮合引擎、聊天室伺服器。
  • MVC 中 Controller 可視為 Model 與 View 的中介者。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved