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