C# 中 釋出訂閱例項

★Angel★發表於2024-04-19

釋出-訂閱模式是一種廣泛應用於多種程式語言和框架中的設計模式,它透過訊息傳遞機制實現釋出者和訂閱者之間的解耦,允許它們在不直接相互依賴的情況下進行互動。這種模式特別適合用於實現事件驅動的系統,例如在圖形使用者介面中處理使用者操作事件、在訊息佇列系統中傳遞訊息等場景。

在釋出-訂閱模式中,主要涉及以下角色:

釋出者(Publisher):負責釋出事件。釋出者不需要了解哪些訂閱者會接收這些事件,只需在適當的時機觸發事件的釋出。
訂閱者(Subscriber):負責訂閱事件,並在接收到事件時做出相應的處理。訂閱者需要知道它們訂閱的是哪個釋出者的事件,但無需關心釋出者的具體實現細節。
呼叫者(Caller):雖然不是釋出-訂閱模式的核心角色,但可以視為觸發事件釋出的實體。呼叫者透過呼叫釋出者的釋出方法來觸發事件的釋出。
事件(Event):這是釋出者定義的訊息型別,訂閱者會根據這個事件型別進行相應的處理。
訊息佇列(Message Queue):在某些實現中,訊息佇列作為中介軟體用於進一步解耦釋出者和訂閱者。釋出者將事件釋出到訊息佇列,而訂閱者從訊息佇列中訂閱這些事件。
在這種模式中,釋出者通常具有一個釋出(或通知)方法,訂閱者可以透過訂閱方法來註冊自己。這樣,當釋出者釋出事件時,所有註冊的訂閱者都會接收到通知。釋出-訂閱模式透過這種機制,使得系統的不同部分可以在不瞭解對方具體實現的情況下相互通訊,從而提高了系統的靈活性和可維護性。

例項程式碼:
釋出者:
public class Publisher
{
//定義事件
public event Action mAction = null;

    //在釋出方法中執行事件
    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("明天有雨");  
    }
}

相關文章