用一個中介者對象封裝一系列對象之間的交互。中介者使各對象不需要顯式相互引用,從而降低耦合,且能獨立改變交互邏輯。
// 抽象中介者
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"));
}
}
| 優點 | 缺點 |
|---|---|
| 同事類解耦,單一職責 | 中介者可能膨脹成「上帝類」,邏輯過於集中 |
| 集中管理交互邏輯,易維護 | 新增同事類需修改中介者 (違反開閉原則),可用觀察者模式輔助 |
| 可獨立複用同事類 | 間接通訊增加效能開銷 (通常可忽略) |
JDialog 充當中介者。