傳統事件機制會產生類別間的強耦合。Messenger 模式(又稱事件匯流排)引入中介者,實現「發布者零感知訂閱者、訂閱者零感知發布者」的鬆耦合通訊。本文設計一套支援弱引用、多型別、一次性訂閱的 Messenger 體系,並延伸出資料驅動的訂閱/發布適配器。
Dictionary<T, List<WeakAction>>,Key 為訊息語義型別,Value 為弱引用動作列表。WeakReference,避免 Messenger 持有訂閱者強引用導致記憶體洩漏。Subscribe<T>(Action<T>)、Unsubscribe<T>(Action<T>)、Notify<T>(T message)、NotifyAsync<T>(T message)。| 類型 | 特點 | 適用場景 |
|---|---|---|
| GeneralMessenger | 繼承 Messenger<object>,通用無型別限制 | 大多數鬆耦合通訊場景 |
| TypeMessenger | 泛型 Messenger<TMessage>,按訊息型別分發 | 訊息驅動架構、分散式系統指令分發 |
| OnceOffMessenger | 訂閱一次即自動移除 | 一次性通知、對話框確認等臨時行為 |
所有 Messenger 均可透過 SingletonManager.GetInstance<T>() 取得單例實例。
參考 Apache MINA 過濾器鏈概念,定義雙重角色介面:
OnMessage(T)、OnMessageAsync(T) 發布資料。Subscribe() 註冊處理邏輯,Handle(T) 處理資料。標準實作 PublisherAdapter、SubscriberAdapter<T> 均內建 TypeMessenger:
// 訂閱者註冊處理邏輯
public void Subscribe()
{
messenger.Subscribe<T>(msg => Handle(msg));
}
// 發布者分發資料
public virtual void OnMessage(object message)
{
if (message != null) messenger.NotifyAll(message);
}
public virtual void OnMessageAsync(object message)
{
if (message != null) messenger.NotifyAllAsync(message);
}
防死循環機制:SubscriberAdapter 發布資料時,若型別與自身訂閱型別相同,會被攔截拋棄,避免無限遞迴。
Messenger 模式以「中介者+弱引用+型別語義」取代傳統事件,極大降低元件間耦合,適合插件架構、模組化系統、分散式訊息處理。配合單例管理與適配器模式,可構建類似 MINA 過濾器鏈的資料處理管線。