您的位置:首页 > 其它

Observer Pattern, Delegate and Event

2008-10-23 16:02 369 查看
When we learn the Observer Pattern, we will see the Figure like this:

another version

namespace ObserverPattern2_2

{

class Program

{

static void Main(string[] args)

{

Subject subject = new Subject();

Observer1 o1 = new Observer1(subject);

Observer2 o2 = new Observer2(subject);

subject.Notify("billok");

subject.Notify("billchen");

subject.RemoveObserver(o2);

subject.Notify("cjb");

Console.ReadLine();

}

}

public abstract class Observer

{

private ISubject iSubject;

private Observer() { }

public Observer(ISubject iSubject)

{

this.iSubject = iSubject;

this.iSubject.RegisterObserver(this);//register itseft

}

public abstract void Update(string userName);

}

public class Observer1 : Observer

{

public Observer1(ISubject iSubject) : base(iSubject) { }

public override void Update(string userName)

{

Console.WriteLine("Update Observer1 " + userName);

}

}

public class Observer2 : Observer

{

public Observer2(ISubject iSubject) : base(iSubject) { }

public override void Update(string userName)

{

Console.WriteLine("Update Observer2 " + userName);

}

}

public interface ISubject

{

void RegisterObserver(Observer observer);//register an Observer

void RemoveObserver(Observer observer);//remove an Observer

void Notify(string userName);//notify observers when the state is changed

}

public class Subject : ISubject

{

private List<Observer> observers;

public Subject()

{

observers = new List<Observer>();

}

public void RegisterObserver(Observer observer)

{

if (!observers.Contains(observer))

observers.Add(observer);

}

public void RemoveObserver(Observer observer)

{

int i = observers.IndexOf(observer);

if (i >= 0)

observers.Remove(observer);

}

public void Notify(string userName)

{

foreach (Observer observer in observers)

{

observer.Update(userName);

}

}

}

}

Okay, Now! Let us take attention to the implement of Observer Pattern in C#.

We should use the Delegate and Event to implement the Observer Pattern in the .NET Framework. I give the new edition for .net like it:

namespace ObserverPattern3

{

class Program

{

static void Main(string[] args)

{

Trigger trigger = new Trigger();

trigger.Changed += new Trigger.ChangedEventHandler(trigger_Changed);

trigger.Changed += delegate(object sender, ChangedEventArgs e)

{

Console.WriteLine("delegate Observer: "+e.UserName);

};

trigger.Changed += Observer1;

trigger.Changed += Observer2;

trigger.Update("billok");

trigger.Changed -= Observer2;

trigger.Update("cjb");

Console.ReadLine();

}

static void trigger_Changed(object sender, ChangedEventArgs e)

{

Console.WriteLine("custom Observer: " + e.UserName);

}

public static void Observer1(Object sender, ChangedEventArgs e)

{

Console.WriteLine("Observer1: " + e.UserName);

}

public static void Observer2(Object sender, ChangedEventArgs e)

{

Console.WriteLine("Observer2: " + e.UserName);

}

}

public class ChangedEventArgs : EventArgs

{

public readonly string UserName;

public ChangedEventArgs(string userName)

{

this.UserName = userName;

}

}

public class Trigger

{

//declare a delegate variable.

public delegate void ChangedEventHandler(Object sender, ChangedEventArgs e);

public event ChangedEventHandler Changed;//declare a event.

protected virtual void OnChanged(ChangedEventArgs e)

{

if (Changed != null)

{

Changed(this, e);

}

}

public void Update(string userName)

{

ChangedEventArgs e = new ChangedEventArgs(userName);

OnChanged(e);

}

}

}

You can see i define a Delegate variable and Event variable in the Trigger classs.

Please notice how to define the event frame. attention:

The name of Delegate type must end by EventHandler.

Definition of Delegate must have "void" return value, and it have two parameters, one is Object type, One is EventArgs type or implement of the EventArgs.

The name of Event is remove the "EventHandler" from the name of Delegate.

The name of Implement of the EventArgs should end by EventArgs.

How to register and remove the observer? we can use "+=" and "-=" to do it. please look the source code.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: