C#事件委托和观察者模式的比较2011-03-25看了C#的事件,发觉跟学java时见到的观察者模式相似,网上搜了一下,有总结的帖 子,转载如下namespace MyCollections { using System.Collections; //------------------------------------------------------------------------ ----- //该委托定义相当于观察者模式中的 Notify()函数, //用来通知观察者关于subject 的变化 //通知观察者,观察者会自动执行观察者内的Update(),Update()方法会暴露给 subjects. // A delegate type for hooking up change notifications. public delegate void ChangedEventHandler(object sender, EventArgs e);
// A class that works just like ArrayList, but sends event // notifications whenever the list changes. public class ListWithChangedEvent: ArrayList { // An event that clients can use to be notified whenever the // elements of the list change. public event ChangedEventHandler Changed; //事件相当于实做Notify()函数
// Invoke the Changed event; called whenever list changes protected virtual void 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 public override int Add(object value) { int i = base.Add(value); OnChanged(EventArgs.Empty); return i; }
public override void Clear() { base.Clear(); OnChanged(EventArgs.Empty); }
public override object this[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. private void ListChanged(object sender, EventArgs e) { Console.WriteLine("This is called when the event fires."); //这里类似于观察者暴露给subjects 的Update()方法 Thread.Sleep(5000); }
public void Detach() { // Detach the event and delete the list List.Changed -= new ChangedEventHandler(ListChanged); //这里类似于 RemoveObserver(); List = null; } }
class Test { // Test the ListWithChangedEvent class. public static void 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(); //删除观察者 } } }