Для понимания этого паттерна можно представить следующую ситуацию. Все мы используем социальные сети, и многие из нас подписаны на какие-то рассылки, групп. В таком аспекте мы являемся наблюдателями Observer, а владелиц группы издателем Subject. Хоть там за кулисами мы и не видим всего происходящего, но именно этот паттерн там реализован. Если бы владелец, вручную делал рассылку и принимал нас в качестве подписчиков самостоятельно, то ему необходимо было бы нас зарегистрировать, и в дальнейшем, когда у него был новый контент передавал нам свежи новости. А мы как его верные подписчики их читали.
Для упрощенного понимания паттерна я использовал велосипед, однако в C# уже есть готовые интерфейсы, которые позволяют быстрее реализовать этот паттерн я приведу названия ниже:
// Определяет поставщика push-уведомлений. public interface IObservable<out T> // Предоставляет механизм для получения push-уведомлений. public interface IObserver<in T>
Так давайте реализуем эту ситуацию на C# в коде!
using System; using System.Collections.Generic; namespace Паттерн_Наблюдатель { public interface IObserver //наблюдатель { void Update(ISubject s); } public interface ISubject //издатель { void Add(IObserver observer); void Remove(IObserver observer); void Notify(); } public class Publisher : ISubject //издатель { List<IObserver> subscribe = new List<IObserver>(); public void Add(IObserver observer) { subscribe.Add(observer); } public void Remove(IObserver observer) { subscribe.Remove(observer); } public void Notify() { foreach (var item in subscribe) { item.Update(this); } } } public class SubscriberA:IObserver { public void Update(ISubject s) { Console.WriteLine("Подписчик А получил рассылку"); } } public class SubscriberB : IObserver { public void Update(ISubject s) { Console.WriteLine("Подписчик B получил рассылку"); } } public class SubscriberC : IObserver { public void Update(ISubject s) { Console.WriteLine("Подписчик C получил рассылку"); } } public class Program { public static void Main() { Publisher publisher = new Publisher(); //издатель, владелец группы SubscriberA subscriberA = new SubscriberA(); //3 подписчика группы SubscriberB subscriberB = new SubscriberB(); SubscriberC subscriberC = new SubscriberC(); publisher.Add(subscriberA); //подписваются на канал publisher.Add(subscriberB); publisher.Add(subscriberC); publisher.Notify();// вышли новости Console.WriteLine("Удалили одного из подписчиков"); publisher.Remove(subscriberB);//подписчик отписался от группы publisher.Notify(); //вышел новый контент делаем рассылку Console.ReadKey(); } } }
Подписчик А получил рассылку
Подписчик B получил рассылку
Подписчик C получил рассылку
Удалили одного из подписчиков
Подписчик А получил рассылку
Подписчик C получил рассылку
