釋出-訂閱模式是一種廣泛應用於多種程式語言和框架中的設計模式,它透過訊息傳遞機制實現釋出者和訂閱者之間的解耦,允許它們在不直接相互依賴的情況下進行互動。這種模式特別適合用於實現事件驅動的系統,例如在圖形使用者介面中處理使用者操作事件、在訊息佇列系統中傳遞訊息等場景。
在釋出-訂閱模式中,主要涉及以下角色:
釋出者(Publisher):負責釋出事件。釋出者不需要了解哪些訂閱者會接收這些事件,只需在適當的時機觸發事件的釋出。
訂閱者(Subscriber):負責訂閱事件,並在接收到事件時做出相應的處理。訂閱者需要知道它們訂閱的是哪個釋出者的事件,但無需關心釋出者的具體實現細節。
呼叫者(Caller):雖然不是釋出-訂閱模式的核心角色,但可以視為觸發事件釋出的實體。呼叫者透過呼叫釋出者的釋出方法來觸發事件的釋出。
事件(Event):這是釋出者定義的訊息型別,訂閱者會根據這個事件型別進行相應的處理。
訊息佇列(Message Queue):在某些實現中,訊息佇列作為中介軟體用於進一步解耦釋出者和訂閱者。釋出者將事件釋出到訊息佇列,而訂閱者從訊息佇列中訂閱這些事件。
在這種模式中,釋出者通常具有一個釋出(或通知)方法,訂閱者可以透過訂閱方法來註冊自己。這樣,當釋出者釋出事件時,所有註冊的訂閱者都會接收到通知。釋出-訂閱模式透過這種機制,使得系統的不同部分可以在不瞭解對方具體實現的情況下相互通訊,從而提高了系統的靈活性和可維護性。
例項程式碼:
釋出者:
public class Publisher
{
//定義事件
public event Action
//在釋出方法中執行事件
public void Publish(string message)
{
if (mAction!= null)
{
mAction.Invoke(message);
}
}
}
訂閱者:
public class Subscriber
{
// 引用釋出者
public Publisher publisher;
// 訂閱釋出者事件
public void Subscribe(Publisher publisher)
{
publisher.mAction += DoSomething;
}
//需要執行的方法
private void DoSomething(string str)
{
Console.WriteLine($"訂閱到事件:{str}");
}
}
//呼叫者:
public class Tests
{
[Test]
public void Test1()
{
Publisher publisher = new Publisher();
Subscriber subscriber1 = new Subscriber();
Subscriber subscriber2 = new Subscriber();
// 訂閱事件
subscriber1.Subscribe(publisher);
subscriber2.Subscribe(publisher);
// 釋出事件
publisher.Publish("明天有雨");
}
}