/* Наблюдатель Определяет зависимость один ко многим между объектами так, что когда один меняет своё состояние, все зависимые объекты оповещаются и обновляются автоматически */ class Program { static void Main() { #region Пример №1 - базовое var concreteObservable = new ConcreteObservable(); concreteObservable.AddObserver(new Observer("Job")); concreteObservable.AddObserver(new Observer("Robin")); concreteObservable.AddObserver(new Observer("Jaz")); concreteObservable.AddObserver(new Observer("John")); Console.ReadKey(); #endregion } } /// /// Поведение наблюдателя /// interface IObservable { /// /// Добавить наблюдаемого /// /// Наблюдаемый void AddObserver(IObserver observer); /// /// Удалить наблюдаемого /// /// Наблюдаемый void RemoveObserver(IObserver observer); /// /// Оповестить всех наблюдаемых /// void NotifyObservers(); } /// /// Реализация конкретного наблюдателя /// class ConcreteObservable : IObservable { /// /// Список наблюдаемых /// private List _observers; public ConcreteObservable() { _observers = new List(); } public void AddObserver(IObserver observer) { Console.WriteLine("Event Add Observer"); NotifyObservers(); _observers.Add(observer); } public void NotifyObservers() { if(_observers.Count == 0) Console.WriteLine("Не кого оповещать..."); foreach (var observer in _observers) observer.Update(); } public void RemoveObserver(IObserver observer) { _observers.Remove(observer); NotifyObservers(); } } /// /// Поведение наблюдаемого /// interface IObserver { void Update(); } /// /// Наблюдаемый /// class Observer : IObserver { public string Name { get; set; } public Observer(string name) { Name = name; } public void Update() { Console.WriteLine($"Update {Name}"); } }