Strategia rispetto al modello di sottoscrizione dell'editore

0

Diciamo che ho un endpoint di canale in cui ricevo messaggi. Perché voglio elaborare i messaggi in modo diverso a seconda della sua proprietà Header , piuttosto che creare un massiccio switch . Creo diverse strategie con il contratto:

interface IMessageHandler
{
    String MessageHeader {get;}
    void Handle(Message msg);
}

Quindi posso aggiungere nuovi gestori per i nuovi messaggi senza modificare ciò che è già presente. Ma questo lascia la porta aperta per avere più gestori che gestiscono lo stesso tipo di messaggio. O con un piccolo cambiamento, rendere un gestore in grado di gestire diversi tipi di messaggi:

interface IMessageHandler
{
    Boolean CanHandle(Message msg);
    void Handle(Message msg);
}

Ma ... poi inizia a guardare molto al pattern pub / sub, dove la proprietà Header del messaggio sarebbe l'argomento a cui i gestori si iscrivono ...

Dov'è la linea che separa entrambi i pattern?

    
posta NullOrEmpty 26.09.2014 - 16:24
fonte

1 risposta

1

Un'implementazione di strategia canonica avrebbe un'interfaccia singola, IStrategy , con più implementazioni, AStrategy e BStrategy . La tua applicazione richiederebbe un'istanza di IStrategy e riceverà un'implementazione dipendente dallo stato corrente del programma. In questo modo, IMessageHandler è un'istanza del modello di strategia (sebbene tu abbia codificato la decisione di strategia all'interno dell'interfaccia stessa che è dove inizia la somiglianza con Observer).

Il pattern Observer è simile, ma una parte fondamentale è che potresti avere un numero qualsiasi di osservatori. Se dovessi restituire un elenco di IMessageHandlers , saresti molto più vicino al pattern Observer.

In definitiva la differenza principale è semantica. Il pattern Strategia viene utilizzato per determinare come deve essere eseguita la tua funzione; il pattern Observer viene utilizzato per informare le parti interessate di un evento o messaggio.

    
risposta data 26.09.2014 - 18:20
fonte