Для понимания этого паттерна можно представить следующую ситуацию. Все мы используем социальные сети, и многие из нас подписаны на какие-то рассылки, групп. В таком аспекте мы являемся наблюдателями Observer, а владелиц группы издателем Subject. Хоть там за кулисами мы и не видим всего происходящего, но именно этот паттерн там реализован. Если бы владелец, вручную делал рассылку и принимал нас в качестве подписчиков самостоятельно, то ему необходимо было бы нас зарегистрировать, и в дальнейшем, когда у него был новый контент передавал нам свежи новости. А мы как его верные подписчики их читали.
Для упрощенного понимания паттерна я использовал велосипед, однако в C# уже есть готовые интерфейсы, которые позволяют быстрее реализовать этот паттерн я приведу названия ниже:
1 2 3 4 5 |
// Определяет поставщика push-уведомлений. public interface IObservable<out T> // Предоставляет механизм для получения push-уведомлений. public interface IObserver<in T> |
Так давайте реализуем эту ситуацию на C# в коде!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
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(); } } } |
1 2 3 4 5 6 7 |
Подписчик А получил рассылку Подписчик B получил рассылку Подписчик C получил рассылку Удалили одного из подписчиков Подписчик А получил рассылку Подписчик C получил рассылку |