一、发布者和订阅者
很多程序有这样─种需求:当程序中的一个特定事件发生之后,程序的其它部分可以得到该事件已经发生的通知。
发布者/订阅者模式可以满足这种需求。在这种模式下,发布者类定义了一系列程序的其它部分可能感兴趣的事件。其它类可以"注册",以便在这些事件发生时,发布者可以通知它们。这些订阅者类通过向发布者提供一个方法来"注册"以获取通知。事件发生时,发布者"触发事件",然后执行订阅者提交的所有事件。
由订阅者提供的方法称为回调方法,因为发布者通过执行这些方法来"往回调用订阅者的方法"。还可以将它们称为事件处理程序,因为它们是为处理事件而调用的代码。如下展示了一个事件的发布者以及该事件的三个订阅者。
二 声明、订阅事件
(1) 创建委托(类外)
(2) 通过委托定义事件(类中成员)
(3) 如果对事件感兴趣,对事件关联处理程序(类外)
(4) 发布者响应事件(发布者类中)
最开始事件HandlerNum中为null ,通过订阅者往里面添加方法。
delegate void DelNum(); //定义委托类型
发布者
class DataPublisher
{
public event DelNum HandlerNum; //发布者中的事件
public void updata()
{
if(HandlerNum!=null)
{
Console.WriteLine("发布者执行事件");
HandlerNum();
}
}
}
订阅者
class DataSubscriber
{
int number;
public void updateNumber()
{
number++;
Console.WriteLine("订阅者DataSubscriber中的number:" + number);
}
}
class StringSubscriber
{
string str;
public StringSubscriber(DataPublisher p) // 向事件中添加方法
{
p.HandlerNum += updateNumber;
}
public void updateNumber()
{
str = "updateNumber";
Console.WriteLine("订阅者StringSubscriber中的str:" + str);
}
}
三 关联、 执行事件
static void Main(string[] args)
{
//创建发布者对象
DataPublisher publisher = new DataPublisher();
//创建订阅者对象
//订阅者对发布者中的事件感兴趣,关联一个处理程序
DataSubscriber subscriber = new DataSubscriber();
publisher.HandlerNum += subscriber.updateNumber;
StringSubscriber strSubscriber = new StringSubscriber(publisher);
//发布者执行事件
//publisher.HandlerNum();//在外部执行事件不允许,只能在发布者类中调用
publisher.updata();//执行发布者中的事件
Console.ReadKey();
}