C# 中 发布订阅实例

发布-订阅模式是一种广泛应用于多种编程语言和框架中的设计模式,它通过消息传递机制实现发布者和订阅者之间的解耦,允许它们在不直接相互依赖的情况下进行交互。这种模式特别适合用于实现事件驱动的系统,例如在图形用户界面中处理用户操作事件、在消息队列系统中传递消息等场景。

在发布-订阅模式中,主要涉及以下角色:

发布者(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("明天有雨");  
    }
}
posted @ 2024-04-19 14:11  ★Angel★  阅读(214)  评论(0编辑  收藏  举报