95 lines
1.7 KiB
C#
95 lines
1.7 KiB
C#
namespace UpdatedOne;
|
|
|
|
public interface IObserver<TSubject>
|
|
{
|
|
void Update(TSubject subject);
|
|
}
|
|
|
|
public abstract class Subject<TSubject>
|
|
{
|
|
private readonly List<IObserver<TSubject>> _observers = new();
|
|
|
|
public void Subscribe(IObserver<TSubject> observer)
|
|
{
|
|
if (!_observers.Contains(observer))
|
|
_observers.Add(observer);
|
|
}
|
|
|
|
public void Unsubscribe(IObserver<TSubject> observer)
|
|
{
|
|
_observers.Remove(observer);
|
|
}
|
|
|
|
protected void Notify(TSubject subject)
|
|
{
|
|
foreach (IObserver<TSubject> observer in _observers.ToArray())
|
|
observer.Update(subject);
|
|
}
|
|
}
|
|
|
|
public class Data : Subject<Data>
|
|
{
|
|
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<Data>
|
|
{
|
|
public void Update(Data subject)
|
|
{
|
|
int value = subject.GetData();
|
|
|
|
Console.WriteLine($"Bar Graph updated: {value}");
|
|
}
|
|
}
|
|
|
|
public class PieChart : IObserver<Data>
|
|
{
|
|
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);
|
|
}
|
|
}
|