using System.Collections.Generic;
public static void Main()
Subject s = new Subject();
s.Attach(new ConcreteObserverA(s, "X", "DotNet"));
s.Attach(new ConcreteObserverB(s, "Y", "Java"));
s.Attach(new ConcreteObserverA(s, "Z", "SAP"));
s.SubjectState = "-Test-";
public abstract class Observer
public abstract void Update();
public class ConcreteObserverA : Observer
private string _observerState;
public Subject Subject {get; set;}
public ConcreteObserverA(Subject subject, string name, string state)
this._observerState = state;
public override void Update()
Console.WriteLine("Observer A {0}'s new state is {1}", _name, _observerState);
_observerState = Subject.SubjectState;
Console.WriteLine("Observer A {0}'s new state is {1}", _name, _observerState);
public class ConcreteObserverB : Observer
private string _observerState;
public Subject Subject {get; set;}
public ConcreteObserverB(Subject subject, string name, string state)
this._observerState = state;
public override void Update()
Console.WriteLine("Observer B {0}'s new state is {1}", _name, _observerState);
_observerState = Subject.SubjectState;
Console.WriteLine("Observer B {0}'s new state is {1}", _name, _observerState);
public string SubjectState {get; set;}
private List<Observer> _observers = new List<Observer>();
public void Attach(Observer observer)
_observers.Add(observer);
public void Detach(Observer observer)
_observers.Remove(observer);
foreach (Observer o in _observers)