Паттерн Наблюдатель в примерах на C#

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.