Главная
Новости
Статьи
Ремонт
Каркасный дом
Несущие конструкции
Металлические конструкции
Прочность дорог
Дорожные материалы
Стальные конструкции
Грунтовые основания
Опорные сооружения




28.09.2021


28.09.2021


28.09.2021


28.09.2021


27.09.2021


27.09.2021


26.09.2021





Яндекс.Метрика

Канал событий (шаблон проектирования)

08.08.2021

Канал событий (англ. event channel) — фундаментальный шаблон проектирования, используется для создания канала связи и коммуникации через него посредством событий. Этот канал обеспечивает возможность разным издателям публиковать события и подписчикам, подписываясь на них, получать уведомления.

Этот шаблон является расширением шаблона Издатель-подписчик (Publish/Subscribe) путем добавления функций, которые присущи распределенной среде. Так канал является централизованным и подписчик может получать опубликованные события от более, чем одного объекта, даже если он зарегистрирован только на одном канале.

В общем случае шаблон Канал событий описывает интерфейс для объектов-представителей для подписки на канал событий и для объектов-представителей для публикации событий в рамках канала. Использование неких представителей позволяет взаимодействовать настоящим издателям и подписчикам вне рамках самого канала, но посредством него.

Концептуальное описание канала событий показано ниже:

Шаблон Канал событий использует сильно типизированные события; это означает, что подписчик может ожидать поступления определенных типов данных события, если регистрируется для определенного события. Он также позволяет подписчику отправлять события, а не только получать события, посланные ему.

Применение

public interface IEventChannel { void Publish(string topic, string data); void Subscribe(string topic, ISubscriber subscriber); } public interface IPublisher { void Publish(string data); } public interface ISubscriber { void Notify(string data); } public class EventChannel: IEventChannel { private Dictionary<string, List<ISubscriber>> _topics = new Dictionary<string, List<ISubscriber>>(); public void Publish(string topic, string data) { if(!_topics.ContainsKey(topic)) return; foreach(var subscriber in _topics[topic]) subscriber.Notify(data); } public void Subscribe(string topic, ISubscriber subscriber) { if(_topics.ContainsKey(topic)) _topics[topic].Add(subscriber); else _topics.Add(topic, new List<ISubscriber>() { subscriber }); } } public class Publisher: IPublisher { private string _topic; private IEventChannel _channel; public Publisher(string topic, IEventChannel channel) { _topic = topic; _channel = channel; } public void Publish(string data) { _channel.Publish(_topic, data); } } public class Subscriber: ISubscriber { private string _name; public Subscriber(string name) { _name = name; } public void Notify(string data) { Console.Write($"Subscriber '{_name}' notify: '{data}'") } } static class Program { public void Main(string[] args) { var channel = new EventChannel(); var publisherA = new Publisher("#topic.a", channel); var publisherB = new Publisher("#topic.b", channel); var subscriberA = new Subscriber("Reader 1"); var subscriberB = new Subscriber("Reader 2"); channel.Subscribe("#topic.a", subscriberA); channel.Subscribe("#topic.a", subscriberB); channel.Subscribe("#topic.b", subscriberB); // Console write: Subscriber 'Reader 1' notify: 'Text1' // Console write: Subscriber 'Reader 2' notify: 'Text1' publisherA.Publish("Text1"); // Console write: Subscriber 'Reader 2' notify: 'Text2' publisherB.Publish("Text2"); } }

Достоинства

Шаблон Канал событий позволяет легко и быстро создать каналы для публикации и обработки событий (или сообщений), при этом исключив прямого взаимодействия между издателем и подписчиком, что снижает связность объектов и упрощает тестирование.

Недостатки

При реализации шаблона Канал событий увеличивается сложность приложения.


Имя:*
E-Mail:
Комментарий: