EDA常见的拓扑结构
在事件驱动架构中,Mediator 和 Broker 是两种常见的拓扑结构,它们分别是用来管理和传递事件或消息的组件。尽管它们都涉及事件的传递,但其运作方式和使用场景有所不同。
1. Mediator(中介者模式)
-
定义:Mediator 是一种中介模式,负责协调不同组件之间的交互,通过控制和转发消息来减少组件间的直接依赖和耦合。Mediator 作为一个中心化的组件,管理所有的交互流程,所有组件的消息都经过它来进行转发。
-
原理:
- 在 Mediator 模式中,各个组件不会直接相互通信,而是通过 Mediator 进行消息传递。
- Mediator 负责接收来自一个组件的消息,并根据需要将其转发给其他相关组件。
- Mediator 模式具有明确的流程和控制机制,可以集中管理复杂的组件交互。
-
工作流程:
- 组件(比如UI中的按钮或输入框)发出某种操作或事件。
- 这些事件通过 Mediator 传递,Mediator 根据业务逻辑或规则将消息转发给其他组件。
- 通过 Mediator,组件之间的相互依赖减少,解耦变得更加清晰。
-
例子:想象一个在线购物系统,购物车、商品列表、用户信息都作为独立组件工作。当用户点击“购买”按钮时,商品列表、用户信息和购物车等组件的状态都可能受到影响。Mediator 将充当中心,协调这些组件的交互,确保它们的状态一致。
2. Broker(代理模式)
-
定义:Broker 是一种事件驱动模式,无中心、无固定流程,负责在发布者和订阅者之间传递消息。Broker 模式不控制流程,它只是充当“中介”,负责消息的转发。消息的发布者和消费者之间并不直接通信,而是通过 Broker 进行通信。Broker 作为一个解耦的组件,不干涉消息的处理流程。
-
原理:
- 组件(如发布者或消费者)只需通过 Broker 注册和订阅消息,而无需知道彼此的存在。
- Broker 模式没有中心控制,消息的分发由 Broker 负责,但没有明确的消息传递流程或业务规则。
- 消息可以是异步的,允许多个系统之间解耦。
-
工作流程:
- 发布者向 Broker 发布消息。
- 消费者(多个)可以订阅感兴趣的事件或消息。
- Broker 将消息发送给所有已订阅的消费者。
- 发布者和消费者之间没有直接的连接,所有交互都通过 Broker 进行。
-
例子:在电子商务系统中,订单创建时需要通知库存、支付、发货等多个系统。通过 Broker 模式,订单创建事件可以发布到 Broker,Broker 会将这个事件推送给所有相关的系统,确保各个系统能够处理相关业务。
区别总结:
特性 | Mediator | Broker |
---|---|---|
角色 | 中介者,管理消息和事件的转发 | 代理,负责传递消息,但不控制流程 |
控制 | 由 Mediator 控制事件的流转和处理 | 无中心控制,消息由发布者和消费者直接交互 |
组件交互 | 组件之间的交互通过 Mediator 进行,遵循明确的交互流程 | 发布者和消费者通过 Broker 注册和订阅消息,没有固定的处理流程 |
适用场景 | 适合较小范围的组件协调,UI 系统、复杂的内部交互等 | 适合大规模的异步系统,事件驱动的分布式系统 |
Mediator模式的流程(举例)
假设我们有一个购物车系统,包括商品列表、购物车和支付信息。Mediator 负责协调这些组件。
组件结构:
- ProductList(商品列表):用户选择商品时添加到购物车。
- ShoppingCart(购物车):负责保存选中的商品。
- User(用户):从购物车中移除商品。
Mediator 充当中心角色,协调这些组件的交互。
// Mediator 接口
public interface ShoppingCartMediator {void addProduct(String product);void removeProduct(String product);
}// 购物车类
public class ShoppingCart implements ShoppingCartMediator {private List<String> products = new ArrayList<>();@Overridepublic void addProduct(String product) {products.add(product);System.out.println("Product added to cart: " + product);}@Overridepublic void removeProduct(String product) {products.remove(product);System.out.println("Product removed from cart: " + product);}
}// 商品列表类
public class ProductList {private ShoppingCartMediator mediator;public ProductList(ShoppingCartMediator mediator) {this.mediator = mediator;}public void selectProduct(String product) {mediator.addProduct(product);}
}// 用户类
public class User {private ShoppingCartMediator mediator;public User(ShoppingCartMediator mediator) {this.mediator = mediator;}public void removeFromCart(String product) {mediator.removeProduct(product);}
}// 代码示例
public class Main {public static void main(String[] args) {ShoppingCart cart = new ShoppingCart();ProductList productList = new ProductList(cart);User user = new User(cart);// 用户选择商品productList.selectProduct("Laptop");productList.selectProduct("Phone");// 用户从购物车中删除商品user.removeFromCart("Laptop");}
}
Broker模式的流程(举例)
假设在一个电商系统中,订单创建时需要通知多个系统(如支付系统、库存系统等)。这时,Broker 模式适用于解耦和异步处理。
组件结构:
- OrderCreatedEvent(订单创建事件):发布订单创建事件。
- PaymentSystem(支付系统):处理订单支付。
- InventorySystem(库存系统):更新库存。
Broker 作为中介者,发布消息并将事件通知给所有订阅者。
// Broker 接口
public interface EventBroker {void registerListener(String eventType, EventListener listener);void dispatchEvent(String eventType, String message);
}// 事件监听器接口
public interface EventListener {void onEvent(String message);
}// 实现一个消息经纪人
public class OrderEventBroker implements EventBroker {private Map<String, List<EventListener>> listeners = new HashMap<>();@Overridepublic void registerListener(String eventType, EventListener listener) {listeners.computeIfAbsent(eventType, k -> new ArrayList<>()).add(listener);}@Overridepublic void dispatchEvent(String eventType, String message) {if (listeners.containsKey(eventType)) {for (EventListener listener : listeners.get(eventType)) {listener.onEvent(message);}}}
}// 各种系统作为事件监听器
public class PaymentSystem implements EventListener {@Overridepublic void onEvent(String message) {System.out.println("Payment System received: " + message);}
}public class InventorySystem implements EventListener {@Overridepublic void onEvent(String message) {System.out.println("Inventory System received: " + message);}
}// 使用示例
public class Main {public static void main(String[] args) {EventBroker broker = new OrderEventBroker();// 注册监听器broker.registerListener("orderCreated", new PaymentSystem());broker.registerListener("orderCreated", new InventorySystem());// 当订单创建时,通知所有注册的系统broker.dispatchEvent("orderCreated", "New order created with ID: 12345");}
}
通过以上例子可以看到,在 Mediator 模式下,组件之间通过 Mediator 进行交互,而在 Broker 模式下,消息的发布者和订阅者之间通过 Broker 来解耦。