using System.Collections.Generic;
public interface ISubject<T>
void Attach(Action<T> observer);
void Detach(Action<T> observer);
public struct PieceOfData {
public int Value { get; set; }
public class Subject : ISubject<PieceOfData>
public PieceOfData Context { get; set; }
private List<Action<PieceOfData>> _observers = new List<Action<PieceOfData>>();
public void Attach(Action<PieceOfData> observer)
this._observers.Add(observer);
public void Detach(Action<PieceOfData> observer)
this._observers.Remove(observer);
foreach (var observer in _observers)
observer.Invoke(this.Context);
public static void Main(string[] args)
var subject = new Subject
Context = new PieceOfData { Value = 10 }
subject.Attach((data) => Console.WriteLine(data.Value + 1));
subject.Attach((data) => Console.WriteLine(data.Value * 2));
subject.Attach((data) => Console.WriteLine((data.Value + 1) * 2));