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]