using System.Collections.Generic;
public static void Main()
var s = new ConcreteSubject();
s.Attach(new ConcreteObserver(s, "x"));
s.Attach(new ConcreteObserver(s, "y"));
s.Attach(new ConcreteObserver(s, "z"));
public abstract void Update();
Observers = new List<Observer>();
public List<Observer> Observers { get; set; }
public void Attach(Observer observer)
public void Detach(Observer observer)
Observers.Remove(observer);
foreach(var o in Observers)
class ConcreteSubject : Subject
public string SubjectState {get;set;}
class ConcreteObserver : Observer
private ConcreteSubject _subject;
public string ObserverState {get;set;}
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 {get;set;}