namespace UpdatedOne; public interface IObserver { void Update(TSubject subject); } public abstract class Subject { private readonly List> _observers = new(); public void Subscribe(IObserver observer) { if (!_observers.Contains(observer)) _observers.Add(observer); } public void Unsubscribe(IObserver observer) { _observers.Remove(observer); } protected void Notify(TSubject subject) { foreach (IObserver observer in _observers.ToArray()) observer.Update(subject); } } public class Data : Subject { private int _value; public Data(int value) { _value = value; } public void SetData(int value) { if (_value == value) return; _value = value; Console.WriteLine($"Data changed to {_value}"); Notify(this); } public int GetData() { return _value; } } public class BarGraph : IObserver { public void Update(Data subject) { int value = subject.GetData(); Console.WriteLine($"Bar Graph updated: {value}"); } } public class PieChart : IObserver { public void Update(Data subject) { int value = subject.GetData(); Console.WriteLine($"Pie Chart updated: {value}"); } } internal static class Program { private static void Main() { Data data = new Data(2); BarGraph barGraph = new BarGraph(); PieChart pieChart = new PieChart(); data.Subscribe(barGraph); data.Subscribe(pieChart); data.SetData(3); data.Unsubscribe(barGraph); data.Unsubscribe(pieChart); } }