using System.Collections.Generic;
public static void Main()
ConcreteSubject s = new ConcreteSubject();
s.Attach(new ConcreteObserver(s, "X"));
s.Attach(new ConcreteObserver(s, "Y"));
s.Attach(new ConcreteObserver(s, "Z"));
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)
class ConcreteSubject : Subject
private string _subjectState;
public string SubjectState
public abstract void Update();
class ConcreteObserver : Observer
private string _observerState;
private ConcreteSubject _subject;
public ConcreteObserver(ConcreteSubject subject, string name)
public override void Update()
_observerState = _subject.SubjectState;
Console.WriteLine("Observer {0}'s new state is {1}", _name, _observerState);
public ConcreteSubject Subject