/* Наблюдатель
Определяет зависимость один ко многим
между объектами так, что когда один меняет
своё состояние, все зависимые объекты оповещаются
и обновляются автоматически
*/
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}");
}
}