C# EventHandler观察者模式

C#和java比较: java中使用的是接口。
C#使用委托机制,能够用时 + 运算符进行注册,直接多播。 而java中是通常是使用一个集合来保存观察者。java

发布者(Publisher)= 被观察者 (Observable) = 事件源(java中的EventObject,C#中的sender)
订阅者(Subscriber)=观察者(Observer)     = 接收者(java中继承EventLister,接口, 或Observer接口, C#因为委托机制,不须要继承接口,直接按EventHandler实现回调方法)异步

在发生其余类或对象关注的事情时,类或对象可经过事件通知它们。发送(或引起)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”。
在典型的 C# Windows 窗体或 Web 应用程序中,可订阅由控件(如按钮和列表框)引起的事件。可以使用 Visual C# 集成开发环境 (IDE) 来浏览控件发布的事件,选择要处理的事件。IDE 会自动添加空事件处理程序方法和订阅事件的代码。ide

EventHandler为C#中的预约义委托,专用于表示不生成数据的事件的事件的处理程序方法。
public delegate void EventHandler(
Object sender,
EventArgs e
)
事件具备如下特色:
1.发行者肯定什么时候引起事件,订户肯定执行何种操做来响应该事件。
2.一个事件能够有多个订户。一个订户可处理来自多个发行者的多个事件。
3.没有订户的事件永远不会被调用。
4.事件一般用于通知用户操做(如:图形用户界面中的按钮单击或菜单选择操做)。
5.若是一个事件有多个订户,当引起该事件时,会同步调用多个事件处理程序。要异步调用事件,请参见使用异步方式调用同步方法。
6.能够利用事件同步线程。
7.在 .NET Framework 类库中,事件是基于 EventHandler 委托和 EventArgs 基类的。函数

下面的示例演示了上述步骤,它将自定义 EventArgs 类和 EventHandler<T> 用做事件类型。this

 

namespace ConsoleApplication2 { using System; using System.Collections.Generic; // 自定义一个事件类来保存事件信息
    public class CustomEventArgs : EventArgs { public CustomEventArgs(string s) { message = s; } private string message; public string Message { get { return message; } set { message = value; } } } // 广播事件的类
    class Publisher { // 使用 EventHandler<T> 声明一个事件
        public event EventHandler<CustomEventArgs> RaiseCustomEvent; //这个方法是作了一些事情。 而后触发一个事件。
        public void DoSomething() { //DoSomething………… // 你也能够再触发事件前,执行一些其余的代码
            OnRaiseCustomEvent(new CustomEventArgs("Did something,hi 这是事件消息")); } //使用虚方法,让子类能够重写。 to allow derived classes to override the event invocation behavior
        protected virtual void OnRaiseCustomEvent(CustomEventArgs e) { // 定义一个局部变量,已防止最后一个订阅者恰好在检查null后取消订阅
            EventHandler<CustomEventArgs> handler = RaiseCustomEvent; // 若是没有 订阅者(观察者), 委托对象将为null
            if (handler != null) { // 格式化事件消息中 的字符串
                e.Message += String.Format(" at {0}", DateTime.Now.ToString()); // 这是最重要的一句。 // 此时执行的 handler已是一个多播委托(若是有多个订阅者或观察者注册)。 // 既然是多播委托,就能够依次调用各个 回调函数 (既然是回调函数,实际的执行就由订阅者类决定)。 //这里面传入一个this, 就表明 事件源(或发布者 或 被观察者 都一个意思)
                handler(this, e); } } } //用来注册事件的类
    class Subscriber { private string id; public Subscriber(string ID, Publisher pub) { id = ID; // 注册事件,使用C#2.0语法 //注册这个动做,应该有订阅者主动进行,而且能够再后期取消注册
            pub.RaiseCustomEvent += HandleCustomEvent; } // 实现回调函数。 在事件发生后,执行什么样的操做。这里只是简单的打印信息。
        void HandleCustomEvent(object sender, CustomEventArgs e) { //这就是实际的操做。
            Console.WriteLine(id + " received this message: {0}", e.Message); } } class Class1 { static void Main(string[] args) { Publisher pub = new Publisher(); Subscriber sub1 = new Subscriber("sub1", pub); Subscriber sub2 = new Subscriber("sub2", pub); // 调用这个方法来产生事件
 pub.DoSomething(); // Keep the console window open
            Console.WriteLine("Press Enter to close this window."); Console.ReadLine(); } } }
相关文章
相关标签/搜索