C# 使用事件实现发布订阅模式

C# 使用事件实现发布订阅模式

我们假设一个简单的场景:
发布者有一个数字,这个数字可能会改变
订阅者希望每次当发布者的数字改变时,自己都要收到消息

如何实现代码呢?
1.定义发布者类

// 发布者,当数字改变时会发布一个NumberChange事件
class Publisher
{
  public delegate void NumberChangeDelegate(int newValue);
  public event NumberChangeDelegate NumberChange;
  private int myNumber;
  public int MyNumber
  {
    get { return myNumber; }
    set
    {
      if (value != MyNumber)
      {
        myNumber = value;
        NumberChange(value);
      }
    }
  }
}

2.定义订阅者类

// 订阅者,当收到发布者的NumberChange事件时执行一些操作
class Subscriber
{
  public void OnNumberChange(int newValue)
  {
    Console.WriteLine("Number is changed to " + newValue);
  }
}

3.Main函数

public static void Main(string[] args)
{
  // 创建一个发布者
  Publisher publisher = new Publisher();

  // 创建第一个订阅者并订阅发布者的NumberChange事件
  Subscriber subscriber = new Subscriber();
  publisher.NumberChange += subscriber.OnNumberChange;

  // 创建第二个订阅者并订阅发布者的NumberChange事件
  Subscriber subscriber2 = new Subscriber();
  publisher.NumberChange += subscriber2.OnNumberChange;

  publisher.MyNumber = 1;
  publisher.MyNumber = 2;
}

完整代码

using System;
namespace TestEvent
{
  // 发布者,当数字改变时会发布一个NumberChange事件
  class Publisher
  {
    public delegate void NumberChangeDelegate(int newValue);
    public event NumberChangeDelegate NumberChange;
    private int myNumber;
    public int MyNumber
    {
      get { return myNumber; }
      set
      {
        if (value != MyNumber)
        {
          myNumber = value;
          NumberChange(value);
        }
      }
    }
  }

  // 订阅者,当收到发布者的NumberChange事件时执行一些操作
  class Subscriber
  {
    public void OnNumberChange(int newValue)
    {
      Console.WriteLine("Number is changed to " + newValue);
    }
  }

  class Program
  {
    public static void Main(string[] args)
    {
      // 创建一个发布者
      Publisher publisher = new Publisher();

      // 创建第一个订阅者并订阅发布者的NumberChange事件
      Subscriber subscriber = new Subscriber();
      publisher.NumberChange += subscriber.OnNumberChange;

      // 创建第二个订阅者并订阅发布者的NumberChange事件
      Subscriber subscriber2 = new Subscriber();
      publisher.NumberChange += subscriber2.OnNumberChange;

      publisher.MyNumber = 1;
      publisher.MyNumber = 2;
    }
  }
}

运行结果:
Number is changed to 1
Number is changed to 1
Number is changed to 2
Number is changed to 2

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# 中的 EventHandler 是一种委托类型,用于实现订阅发布模式订阅发布模式是一种常用的软件设计模式,它允许多个对象之间进行松耦合的通信,即发布者(Publisher)发布消息订阅者(Subscriber)订阅消息并接收。 在 C# 中,使用 EventHandler 定义事件,可以通过 += 运算符订阅事件,也可以通过 -= 运算符取消订阅事件。当事件发生时,所有订阅者都会收到通知并执行其注册的处理程序。 例如,以下代码演示了如何定义一个事件订阅它: ``` class Program { static void Main(string[] args) { MyPublisher publisher = new MyPublisher(); MySubscriber subscriber = new MySubscriber(); publisher.MyEvent += subscriber.OnMyEvent; publisher.DoSomething(); } } class MyPublisher { public event EventHandler MyEvent; public void DoSomething() { Console.WriteLine("Publisher is doing something..."); MyEvent?.Invoke(this, EventArgs.Empty); } } class MySubscriber { public void OnMyEvent(object sender, EventArgs e) { Console.WriteLine("Subscriber is handling the event..."); } } ``` 在上面的代码中,MyPublisher 定义了 MyEvent 事件,并在 DoSomething 方法中触发该事件。MySubscriber 订阅了 MyEvent 事件,并在 OnMyEvent 方法中处理该事件。当调用 publisher.DoSomething() 方法时,会触发 MyEvent 事件并通知 MySubscriber 执行 OnMyEvent 方法。 需要注意的是,事件订阅和取消订阅必须在相同的作用域中进行。在上面的代码中,订阅和取消订阅都是在 Main 方法中进行的。如果将订阅操作移到 MySubscriber 类中,将会得到编译错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值