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.
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.
相关文章推荐
- Observer Pattern, Delegate and Event
- 委托和事件之烧开水:Delegate and Event
- [unity3D基础篇05]重要的设计模式 - 观察者模式(Observer) Event/Delegate
- C#编程利器之四:委托与事件(Delegate and event)
- Delegate and event
- Delegate and Event
- delegate and event
- 委托和事件[delegate and event]_C#
- event and delegate
- 【唠叨两句】Event and delegate
- delegate and event
- About Delegate and Event
- Good Example Telling Event and Delegate
- Callback with event and delegate over .net remoting
- Delegate and Event探索
- delegate and event
- .Net event vs. observer Pattern
- Recursive delegate and state pattern (C# version)
- Observer (C# Delegate - Event) - Design Patterns学习笔记(4)
- 委托和事件[delegate and event]_C#