103 lines
2.6 KiB
C#
103 lines
2.6 KiB
C#
|
/* Наблюдатель
|
|||
|
Определяет зависимость один ко многим
|
|||
|
между объектами так, что когда один меняет
|
|||
|
своё состояние, все зависимые объекты оповещаются
|
|||
|
и обновляются автоматически
|
|||
|
*/
|
|||
|
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
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Поведение наблюдателя
|
|||
|
/// </summary>
|
|||
|
interface IObservable
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// Добавить наблюдаемого
|
|||
|
/// </summary>
|
|||
|
/// <param name="observer">Наблюдаемый</param>
|
|||
|
void AddObserver(IObserver observer);
|
|||
|
/// <summary>
|
|||
|
/// Удалить наблюдаемого
|
|||
|
/// </summary>
|
|||
|
/// <param name="observer">Наблюдаемый</param>
|
|||
|
void RemoveObserver(IObserver observer);
|
|||
|
/// <summary>
|
|||
|
/// Оповестить всех наблюдаемых
|
|||
|
/// </summary>
|
|||
|
void NotifyObservers();
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Реализация конкретного наблюдателя
|
|||
|
/// </summary>
|
|||
|
class ConcreteObservable : IObservable
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// Список наблюдаемых
|
|||
|
/// </summary>
|
|||
|
private List<IObserver> _observers;
|
|||
|
|
|||
|
public ConcreteObservable()
|
|||
|
{
|
|||
|
_observers = new List<IObserver>();
|
|||
|
}
|
|||
|
|
|||
|
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();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Поведение наблюдаемого
|
|||
|
/// </summary>
|
|||
|
interface IObserver
|
|||
|
{
|
|||
|
void Update();
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Наблюдаемый
|
|||
|
/// </summary>
|
|||
|
class Observer : IObserver
|
|||
|
{
|
|||
|
public string Name { get; set; }
|
|||
|
|
|||
|
public Observer(string name)
|
|||
|
{
|
|||
|
Name = name;
|
|||
|
}
|
|||
|
|
|||
|
public void Update()
|
|||
|
{
|
|||
|
Console.WriteLine($"Update {Name}");
|
|||
|
}
|
|||
|
}
|