Design Patterns: Observer

CSharp · Console

/Program.cs

using System;
using System.Collections.Generic;

public class Program
{
	public static void Main()
	{
		ConcreteSubject subject = new ConcreteSubject();
		ConcreteObserver observer = new ConcreteObserver(subject);
		subject.Attach(observer);
		subject.SomeState = 100;
		subject.Notify();
	}
}

abstract class Subject
{
	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 (var observer in this.observers)
		{
			observer.Update();
		}
	}
}

class ConcreteSubject : Subject
{
	public int SomeState { get; set; }
}

abstract class Observer
{
	public abstract void Update();
}

class ConcreteObserver : Observer
{
	public int ObserverState { get; set; }

	ConcreteSubject MySubject { get; set; }

	public ConcreteObserver(ConcreteSubject subject)
	{
		this.MySubject = subject;
	}

	public override void Update()
	{
		this.ObserverState = MySubject.SomeState;
		Console.WriteLine("My state has been updated: " + this.ObserverState);
	}
}
;