Posted on
2008-06-15 22:26龙泰
阅读(1717)
评论(0)
编辑收藏举报
namespace MyCollections { using System.Collections; //----------------------------------------------------------------------------- //该委托定义相当于观察者模式中的 Notify()函数, //用来通知观察者关于subject 的变化 //通知观察者,观察者会自动执行观察者内的Update(),Update()方法会暴露给subjects. // A delegate type for hooking up change notifications. publicdelegatevoid ChangedEventHandler(object sender, EventArgs e); //------------------------------------------------------------------------------ //该类相当于观察者模式中的subjects. // A class that works just like ArrayList, but sends event // notifications whenever the list changes. publicclass ListWithChangedEvent: ArrayList { // An event that clients can use to be notified whenever the // elements of the list change. publicevent ChangedEventHandler Changed; //事件相当于实做Notify()函数 // Invoke the Changed event; called whenever list changes protectedvirtualvoid OnChanged(EventArgs e) { if (Changed !=null) //这里表示subjects状态有变化,需要通知observers. Changed(this, e); } // Override some of the methods that can change the list; // invoke event after each publicoverrideint Add(object value) { int i =base.Add(value); OnChanged(EventArgs.Empty); return i; } publicoverridevoid Clear() { base.Clear(); OnChanged(EventArgs.Empty); } publicoverrideobjectthis[int index] { set { base[index] = value; OnChanged(EventArgs.Empty); } } } } namespace TestEvents { using MyCollections; //侦听者类似于观察者模式中的observers class EventListener { private ListWithChangedEvent List; public EventListener(ListWithChangedEvent list) { List = list; // Add "ListChanged" to the Changed event on "List". List.Changed +=new ChangedEventHandler(ListChanged); //这里类似于AddObserver(); } // This will be called whenever the list changes. privatevoid ListChanged(object sender, EventArgs e) { Console.WriteLine("This is called when the event fires."); //这里类似于观察者暴露给subjects 的Update()方法 Thread.Sleep(5000); } publicvoid Detach() { // Detach the event and delete the list List.Changed -=new ChangedEventHandler(ListChanged); //这里类似于RemoveObserver(); List =null; } } class Test { // Test the ListWithChangedEvent class. publicstaticvoid Main() { // Create a new list. ListWithChangedEvent list =new ListWithChangedEvent(); //创建一个subject(observable) // Create a class that listens to the list's change event. EventListener listener =new EventListener(list); //创建一个观察者 // Add and remove items from the list. list.Add("item 1"); //subject 的状态发生变化,通知观察者作相应的动作 ListChanged() list.Clear(); //同上 listener.Detach(); //删除观察者 } } }