using System.Collections.Generic;
void AddObserver(Observer observer);
void RemoveObserver(Observer observer);
void NotifyEvent(string evt);
public class Subject:ISubject {
private List<Observer> observers = new List<Observer>();
public void AddObserver(Observer observer) {
Console.WriteLine("{0} subscribes", observer.ObserverName);
public void RemoveObserver(Observer observer) {
observers.Remove(observer);
Console.WriteLine("{0} UN-subscribes", observer.ObserverName);
public void NotifyEvent(string evt) {
observers.ForEach(x => x.onNotifyEvent(evt));
void onNotifyEvent(string evt);
public class Observer:IObserver {
public string ObserverName { get; private set; }
public Observer(string name) {
this.ObserverName = name;
public virtual void onNotifyEvent(string evt) {
Console.WriteLine("{0} : {1}", this.ObserverName, evt);
public class Physics:Subject {
public void updateEntity(object entity) {
public class AchievementsManager:Observer {
public AchievementsManager(string name):base(name) {}
private bool deathUnlocked = false;
override public void onNotifyEvent(string evt) {
private void unlock(string evt) {
Console.WriteLine("{0} UNLOCKING {1}", this.ObserverName, evt);
static public void Main(string[] args) {
Physics subject = new Physics();
Observer observer1 = new AchievementsManager("AchievementsManager");
subject.AddObserver(observer1);
Observer observer2 = new Observer("AudioManager");
subject.AddObserver(observer2);
subject.RemoveObserver(observer2);
subject.AddObserver(new Observer("ScoreManager"));