Hello World


Monday, December 10, 2007

Observer Design Patterns

Tell Me if something happens will you!
The Observer Pattern is basically our typical Publisher/Subscriber model.
Except in this case it’s referred to as Subject (Publisher) and the Observer (Subscriber).

The whole idea around the Observer Pattern is you the Client wish to be notified when something you subscribed for occurs.
This could be a Button Click Event. The Button (Publisher) notifies those who (Subscribed) for the click notification so then you can do something about it.

Example:
The code demonstrates the Observer pattern in which registered objects are notified of and updated with a state change.

namespace Martins.Observer.Pattern
{
//MainApp startup class
//Observer Design Pattern.
class MainApp
{
//Entry point
static void Main()
{
//Configure Observer pattern
ConcreteSubject s = new ConcreteSubject();

s.Attach(new ConcreteObserver(s,"X"));
s.Attach(new ConcreteObserver(s,"Y"));
s.Attach(new ConcreteObserver(s,"Z"));

//Change subject and notify observers
s.SubjectState = "ABC";
s.Notify();
}
}
//Subject
abstract class Subject
{
private ArrayList observers = new ArrayList();
public void Attach(Observer observer)
{
observers.Add(observer);
}
public void Detach(Observer observer)
{
observers.Remove(observer);
}
public void Notify()
{
foreach (Observer o in observers)
{
o.Update();
}
}
}
//ConcreteSubject
class ConcreteSubject : Subject
{
private string subjectState;
//Property
public string SubjectState
{
get{ return subjectState; }
set{ subjectState = value; }
}
}
//Observer
abstract class Observer
{
public abstract void Update();
}
//ConcreteObserver
class ConcreteObserver : Observer
{
private string name;
private string observerState;
private ConcreteSubject subject;

//Constructor
public ConcreteObserver(
ConcreteSubject subject, string name)
{
this.subject = subject;
this.name = name;
}
public override void Update()
{
observerState = subject.SubjectState;
Console.WriteLine("Observer {0}'s new state is {1}",
name, observerState);
}
//Property
public ConcreteSubject Subject
{
get { return subject; }
set { subject = value; }
}
}
}

No comments:

4GuysFromRolla.com Headlines