Saturday, February 12, 2011

The Observer Design Pattern and Events and delegates in C#

The Observer Pattern

The Observer Pattern belongs to the behavioural pattern. Also termed as "Publisher-Subscriber" Model.
This pattern
Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.

Let me tell you a real world example. Consider an Aution process. What is actually happening there. There is an Auctioneer and a lot of bidders . When the acutioneer call the aution the bidders respond accordingly.

So the basic idea is there is an object which acts as publisher and a number of object which acts as subscribers, who are registered with the publisher. So the publisher changes something all the registered subscribers will be notified.

The events and delegates in C# is implemented based on this pattern


C# Code Sample
using System;
using System.Collections;
class ObserverDemo
{
static void Main()
{
// Configure Observer pattern
ConcretePublisher s = new ConcretePublisher();
s.Attach(new ConcreteObserver(s,"X"));
s.Attach(new ConcreteObserver(s,"Y"));
s.Attach(new ConcreteObserver(s,"Z"));
// Change Publisher and notify observers
s.PublisherState = "ABC";
s.Notify();
// Wait for user
Console.Read();
}
}
// "Publisher"
abstract class Publisher
{
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();
}
}
}
// "ConcretePublisher"
class ConcretePublisher : Publisher
{
private string PublisherState;
// Property
public string PublisherState
{
get{ return PublisherState; }
set{ PublisherState = value; }
}
}
// "Observer"
abstract class Observer
{
public abstract void Update();
}
// "ConcreteObserver"
class ConcreteObserver : Observer
{
private string name;
private string observerState;
private ConcretePublisher publisher;
// Constructor
public ConcreteObserver(
ConcretePublisher publisher, string name)
{
this.Publisher = publisher;
this.name = name;
}
public override void Update()
{
observerState = Publisher.PublisherState;
Console.WriteLine("Observer {0}'s new state is {1}",
name, observerState);
}
// Property
public ConcretePublisher Publisher
{
get { return publisher; }
set { publisher = value; }
}
}

No comments:

Post a Comment