PatternsCSharpProgramming/Patterns/Observer/Program.cs
Dvurechensky 3a28caed27 1.0
Main
2024-10-05 09:15:54 +03:00

103 lines
2.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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