Kanál události (designový vzor)

Kanál  událostí je základním návrhovým vzorem používaným k vytvoření komunikačního kanálu a ke komunikaci přes něj prostřednictvím událostí. Tento kanál poskytuje různým vydavatelům příležitost publikovat události a odběratelům dostávat upozornění tím, že se k nim přihlásí.

Tento vzor rozšiřuje vzor Publish/Subscribe přidáním funkcí, které jsou nativní pro distribuované prostředí . Kanál je tedy centralizovaný a předplatitel může přijímat publikované události z více než jednoho objektu, i když je registrován pouze na jednom kanálu.

Vzor kanálu událostí obecně popisuje rozhraní pro objekty proxy pro přihlášení k odběru kanálu událostí a pro objekty proxy pro publikování událostí v kanálu. Použití některých zástupců umožňuje skutečným vydavatelům a předplatitelům komunikovat mimo samotný kanál, ale prostřednictvím něj.

Koncepční popis kanálu událostí je uveden níže:

Vzor kanálu událostí používá silně typované události ; to znamená, že předplatitel může očekávat určité typy dat událostí, pokud se zaregistruje pro konkrétní událost. Umožňuje také předplatiteli odesílat události, nejen přijímat události, které mu byly odeslány.

Aplikace

public interface IEventChannel { void Publish ( téma řetězce , data řetězce ); void Subscribe ( string topic , ISsubscriber subscriber ); } public interface IPublisher { void Publish ( string data ); } public interface ISsubscriber { void Notify ( string data ); } public class EventChannel : IEventChannel { private Dictionary < string , List < ISsubscriber >> _topics = new Dictionary < string , List < ISsubscriber >>(); public void Publikovat ( řetězec téma , data řetězce ) { if (! _topics . ContainsKey ( téma )) return ; foreach ( var odběratel v _topics [ téma ]) odběratel . oznámit ( údaje ); } public void Odebírat ( string topic , ISsubscriber odběratel ) { if ( _topics . ContainsKey ( topic )) _topics [ topic ]. Přidat ( předplatitel ); jinde _témata . Add ( topic , new List < ISsubscriber >() { subscriber }); } } public class Vydavatel : IPublisher { private string _topic ; private IEventChannel _channel ; public Publisher ( string topic , kanál IEventChannel ) { _topic = topic ; _kanál = kanál ; } public void Publikovat ( data řetězce ) { _channel . Publikovat ( _topic , data ); } } public class Předplatitel : IS Subscriber { private string _name ; public Subscriber ( string name ) { _name = name ; } public void Upozornit ( data řetězce ) { Console . Napište ( $"Upozornění odběratele '{_name}': '{data}'" ) } } static class Program { public void Main ( string [] args ) { var channel = new EventChannel (); var publisherA = new Publisher ( "#topic.a" , kanál ); var vydavatelB = nový vydavatel ( "#topic.b" , kanál ); var subscriberA = nový odběratel ( "čtenář 1" ); var subscriberB = nový odběratel ( "čtenář 2" ); kanál . Odebírat ( "#topic.a" , odběratelA ); kanál . Odebírat ( "#topic.a" , předplatitelB ); kanál . Odebírat ( "#topic.b" , předplatitelB ); // Console write: Předplatitel 'Čtečka 1' notify: 'Text1' // Console write: Subscriber 'Reader 2' notify: 'Text1' publisherA . Publikovat ( "Text1" ); // Console write: Předplatitel 'Reader 2' notify: 'Text2' publisherB . Publikovat ( "Text2" ); } }

Výhody

Vzor Event Channel umožňuje snadno a rychle vytvářet kanály pro publikování a zpracování událostí (nebo zpráv), přičemž eliminuje přímou interakci mezi vydavatelem a odběratelem, což snižuje soudržnost objektů a zjednodušuje testování.

Nevýhody

Implementace vzoru kanálu událostí zvyšuje složitost aplikace.

Viz také

Poznámky

Literatura

  • Programování ve velkém s designovými vzory, Eddie Burris
  • Návrhové vzory Java 201: Beyond the Gang of Four. 2002.
  • Učíme se Javascript Design Patters, Addy Osmani

Odkazy

  • Šablona kanálu události [1]
  • Observer vs. Pub-Sub [2]
  • Publikování a odběr kanálu [3]
  • Rozdíly mezi Observer a Publish/Subscribe Pattern [4]
  • Návrhové vzory JavaScriptu [5]