2014-05-22 15 views
6

L'altro giorno stavo guardando Chain Of Responsibility e ho trovato l'esempio this.Qual è la differenza tra il modello di progettazione Chain Of Responsibility e l'utilizzo di un blocco if-elseif-else semplice?

In sostanza, esiste un gestore astratto e quindi sono gestori concreti, ognuno dei quali implementa il metodo handle del gestore astratto padre. L'implementazione è tale che inizialmente è presente un controllo per vedere se questo particolare gestore può elaborare la richiesta corrente e, in caso contrario, passa la richiesta al suo successore.

Ora, potrei anche fare la stessa cosa usando un semplice blocco condizionale if else. Per prendere il primo esempio dal link qui sopra, ecco come lo cambierei:

class SingleHandler 
{ 
    if(request > 0 && request <= 10) 
    { 
     // Process request 
    } 
    else if(request > 10 && request <= 20) 
    { 
     // Process request differently 
    } 
    else if(request > 20 && request <= 30) 
    { 
     // Process request differently 
    } 
} 

Ora, la mia domanda è, qual è la differenza fondamentale tra i due? C'è qualche ragione specifica per cui dovrei usare Chain Of Responsibility, se posso fornire la stessa identica funzionalità usando i blocchi if-else? Qual è il migliore in termini di prestazioni, consumo di memoria, manutenibilità, scalabilità?

risposta

14

Sì, è possibile riscrivere questo esempio per utilizzare più if-else-cascades. Ma solo perché è un esempio piuttosto semplice.

La catena di responsabilità è un modello dinamico. Ciò significa che i gestori possono essere scambiati durante l'esecuzione. Questo viene spesso eseguito nel codice dell'interfaccia utente in cui diversi controlli nidificati possono rappresentare i gestori. Immagina il seguente scenario:

Hai una finestra. In questa finestra c'è una specie di pannello. In questo pannello c'è una casella di testo. Fai clic con il tasto destro sulla casella di testo. Il comando eseguito dipende dalla gerarchia. Il sistema chiedeva al primo gestore - la casella di testo - di gestire la richiesta di clic. Se non sa cosa fare con la richiesta, la trasmette al suo genitore - il pannello - ecc. Dubito che tu voglia implementare questo tipo di scenario con una if-else-cascade. Ogni volta che cambi l'interfaccia utente, dovresti cambiare la cascata. Ecco perché vengono utilizzati gli oggetti del gestore. Rende il codice intercambiabile e riutilizzabile.

Molti modelli possono essere implementati in un modo diverso. Questa è una pratica abituale nei linguaggi di programmazione di basso livello senza orientamento all'oggetto. Tuttavia, questi codici sono solitamente piuttosto rigidi e difficili da mantenere. Eppure, questo è ciò che li rende veloci.