Для понимания этого паттерна можно представить следующую ситуацию. Все мы используем социальные сети, и многие из нас подписаны на какие-то рассылки, групп. В таком аспекте мы являемся наблюдателями 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 получил рассылку

