Canal de evenimente (model de design)
Un canal de evenimente este un model de design fundamental utilizat pentru a crea un canal de comunicare și a comunica prin intermediul acestuia prin evenimente. Acest canal oferă diferiților editori o oportunitate de a publica evenimente și abonaților să primească notificări prin abonarea la acestea.
Acest model extinde modelul Publicare/Abonare prin adăugarea de caracteristici native pentru un mediu distribuit . Deci canalul este centralizat și abonatul poate primi evenimente publicate de la mai multe obiecte, chiar dacă acesta este înregistrat pe un singur canal.
În general, modelul Canal de evenimente descrie o interfață pentru ca obiectele proxy să se aboneze la un canal de evenimente și pentru ca obiectele proxy să publice evenimente în cadrul unui canal. Utilizarea unor reprezentanți permite editorilor și abonaților reali să interacționeze în afara canalului în sine, dar prin intermediul acestuia.
Descrierea conceptuală a unui canal de evenimente este prezentată mai jos:
Modelul Canal de evenimente folosește evenimente puternic tipizate ; aceasta înseamnă că un abonat se poate aștepta la anumite tipuri de date despre evenimente dacă se înregistrează pentru un anumit eveniment. De asemenea, permite abonatului să trimită evenimente, nu doar să primească evenimentele trimise acestuia.
Aplicație
interfață publică IEventChannel
{
void Publicare ( subiect șir , date șir ); void Subscribe ( subiect șir , abonat ISubscriber ); }
interfață publică IPublisher
{
void Publicare ( șir de date );
}
interfață publică ISubscriber
{
void Notify ( șir de date );
}
public class EventChannel : IEventChannel
{
private Dictionary < string , List < ISabscriber >> _topics =
new Dictionary < string , List < ISabscriber >>();
public void Publicare ( string topic , string date )
{
if (! _topics . ContainsKey ( topic )) return ;
foreach ( var subscriber in _topics [ topic ])
abonat . notifica ( date );
}
public void Subscribe ( string topic , ISubscriber subscriber )
{
if ( _topics . ContainsKey ( topic ))
_topics [ topic ]. Adăugați ( abonat );
else
_subiecte . Adaugă ( subiect , Listă nouă < ISubscriber >() { abonat }); } }
public class Publisher : IPublisher
{
private string _topic ;
privat IEventChannel _canal ;
Public Publisher ( string topic , canal IEventChannel ) { _topic = topic ; _canal = canal ; }
public void Publicare ( șir de date )
{
_canal . Publicare ( _topic , date );
}
}
public class Abonat : ISubscriber
{
private string _name ;
public Abonat ( string name )
{
_name = nume ;
}
public void Notify ( șir de date )
{
Consolă . Scrieți ( $"Abonatul '{_name}' notifică: '{date}'" )
}
}
static class Program
{
public void Main ( string [] args )
{
var canal = new EventChannel ();
var publisherA = nou Publisher ( „#topic.a” , canal );
var publisherB = editor nou ( „#topic.b” , canal ); var subscriberA = new Subscriber ( "Cititor 1" ); var subscriberB = abonat nou ( "Reader 2" );
canalul . Abonare ( " #topic.a " , abonatA );
canalul . Abonare ( " #topic.a " , abonatB );
canalul . Abonare ( " #topic.b " , abonatB );
// Console write: Abonat „Reader 1” notify: „Text1”
// Console write: Subscriber „Reader 2” notify: „Text1”
publisherA . Publicare ( „Text1” );
// Scrie în consolă: Abonatul „Reader 2” notify: „Text2”
publisherB . Publicare ( „Text2” );
}
}
Avantaje
Modelul Canal de evenimente vă permite să creați ușor și rapid canale pentru publicarea și procesarea evenimentelor (sau mesajelor), eliminând în același timp interacțiunea directă dintre editor și abonat, ceea ce reduce coeziunea obiectului și simplifică testarea.
Dezavantaje
Implementarea modelului Canal de evenimente crește complexitatea aplicației.
Vezi și
Note
Literatură
- Programare în mare cu Design Patterns, Eddie Burris
- Modele de design Java 201: Dincolo de Gang of Four. 2002.
- Învățarea modelelor de design Javascript, Addy Osmani
Link -uri
- Șablon de canal de evenimente [1]
- Observer vs Pub-Sub [2]
- Publicare-Abonare canal [3]
- Diferențele dintre modelul Observer și Publicare/Abonare [4]
- Modele de design JavaScript [5]