creativity in code.

creativity is that spark of electricity before an explosion.
it allows us, in a single instance to explore all possibilities without hesitation.

Programming - Observer Behavioral Design Pattern


Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.

The classes and/or objects participating in this example are:

  • Subject
    • knows its observers. Any number of Observer objects may observe a subject
    • provides an interface for attaching and detaching Observer objects.
  • ConcreteSubject
    • stores state of interest to ConcreteObserver
    • sends a notification to its observers when its state changes
  • Observer
    • defines an updating interface for objects that should be notified of changes in a subject.
  • ConcreteObserver
    • maintains a reference to a ConcreteSubject object
    • stores state that should stay consistent with the subject's
    • implements the Observer updating interface to keep its state consistent with the subject's
// Observer pattern -- Structural example

using System;
using System.Collections;

namespace DoFactory.GangOfFour.Observer.Structural
{

// MainApp test application

class MainApp
{
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();

// Wait for user
Console.Read();
}
}

// "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; }
}
}
}
Output expected:
Observer X's new state is ABC
Observer Y's new state is ABC
Observer Z's new state is ABC



Other pages of interest:
[+] Programming - WCF
[+] Programming - Design patterns in Software
[+] Programming - Factory Method Design Pattern
[+] ASP.NET MVC Development
[+] .NET Enterprise provides a truly robust and scalable platform to build business applications on I..
[+] Case studies - Software in business
[+] Artificial Neural Networks
[+] More news on Java OpenSource initiative
[+] Human Computer Interaction
[+] MySQL


Comments(0)

add comment Add Comment

Add your comment

Email address:
Your name:
Do you want your email to be visible?: