observer pattern

A very good article:

http://www.dofactory.com/Patterns/PatternObserver.aspx#_self2

Hide code

// Observer pattern — Structural example

using System;

using System.Collections.Generic;

 

namespace DoFactory.GangOfFour.Observer.Structural

{

/// <summary>

/// MainApp startup class for Structural

/// Observer Design Pattern.

/// </summary>

class MainApp

{

/// <summary>

/// Entry point into console application.

/// </summary>

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.ReadKey();

}

}

 

/// <summary>

/// The ‘Subject’ abstract class

/// </summary>

abstract class Subject

{

private List<Observer> _observers = new List<Observer>();

 

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();

}

}

}

 

/// <summary>

/// The ‘ConcreteSubject’ class

/// </summary>

class ConcreteSubject : Subject

{

private string _subjectState;

 

// Gets or sets subject state

public string SubjectState

{

get { return _subjectState; }

set { _subjectState = value; }

}

}

 

/// <summary>

/// The ‘Observer’ abstract class

/// </summary>

abstract class Observer

{

public abstract void Update();

}

 

/// <summary>

/// The ‘ConcreteObserver’ class

/// </summary>

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);

}

 

// Gets or sets subject

public ConcreteSubject Subject

{

get { return _subject; }

set { _subject = value; }

}

}

}

Advertisements

One thought on “observer pattern

  1. FYI, this is a poor-mediocre example of the Observer pattern. The clean way to use it encapsulates notification.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s