C# 中 发布订阅实例
发布-订阅模式是一种广泛应用于多种编程语言和框架中的设计模式,它通过消息传递机制实现发布者和订阅者之间的解耦,允许它们在不直接相互依赖的情况下进行交互。这种模式特别适合用于实现事件驱动的系统,例如在图形用户界面中处理用户操作事件、在消息队列系统中传递消息等场景。
在发布-订阅模式中,主要涉及以下角色:
发布者(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("明天有雨");
}
}