5

Perché devo utilizzare Chain of responsibility, se potessi caricare tutti i comandi in un contenitore e eseguire solo i comandi uno a uno. Questo farà una catena di elaborazione di una richiesta di fila. Penso che sia meglio di CoR perché puoi rimuovere alcuni comandi particolari o sostituirli con un altro comando in runtime, mentre per CoR devi creare un'altra catena per cambiare qualcosa nella catena dato che non hai accesso agli elementi nel runtime. catena tranne il primo elemento. (È, in realtà, una sola lista collegata.)Catena di responsabilità o comandi in una coda o in uno stack

risposta

1

solo per "keep it semplice stupido" :-)

Creare una coda/stack quando specificamente bisogno, e si dovrebbe sapere quando ne hai bisogno , non è vero?

Per esempio-se si doveva fare qualche semplice manipolazione dei dati come:

data.clean().format().save(); 

vs

commands.push(new Cleaner(data)); 
commands.push(new Formatter(data)); 
commands.push(new Updates(data)); 
commands.execute(); 

anche notare, ho dovuto scrivere più codice per creare nuova struttura dati (comandi impilano).

Ma diciamo che era qualcosa di più strategico, diciamo un gioco sparatutto. Il giocatore può essere colpito, ucciso, ecc., Ei risultati dipendono dal livello di difficoltà scelto del gioco.

headShot = new Command(); 
headShot.push(new FreezePlayer()); 
headShot.push(new BleedPlayer()); 
headShot.push(new KillPlayer()); 

bodyShot = new Command(); 
headShot.push(new FreezePlayer()); 
headShot.push(new BleedPlayer()); 
headShot.push(new LooseHealth()); 

player.onHit = function(hitPoint){ 
    hitPoint.aboveNeck() ? headShot.on(this) : bodyShot.on(this); 
}; 

Avviso in questo caso, abbiamo dovuto creare una strategia che può essere passata e che si verifica in fase di esecuzione.

Quindi, quando in modalità facile, il bodyShot potrebbe non avere l'ultimo elemento (LooseHealth) e headShot potrebbe avere LooseHealth invece di KillPlayer come ultimo elemento.

Spero che aiuti.

+0

Quale è semplice? COR o stack? Per me entrambi sono lo stesso sh * t. – Narek

+0

okay, vedere la risposta modificata sopra – Nishant

+0

Hai confrontato lo stack con static 'data.clean(). Format(). Save();'. Ma stavo chiedendo stack vs COR, dato che i cambiamenti di runtime possono essere fatti in entrambi, come in COR puoi creare nuove catene. – Narek

0

Non penso che il CdR richieda una lista collegata singolarmente. Potrebbe essere un'implementazione comune; ma è possibile utilizzare una lista doppiamente collegata o praticamente qualsiasi altra raccolta/contenitore, a condizione che disaccoppi il mittente del messaggio dal/i destinatario/i del messaggio. Quello che descrivi sembra perfettamente compatibile con il modello del CdR. Hai semplicemente migliorato la possibilità di configurare la catena. E 'importante notare che il GoF definition ci insegna a implementare la catena,

senza rapporti gestore hard-cablaggio e la precedenza,

... ma non credo che dovrebbe limitare la nostra scelta di raccolta per i conduttori.


noti inoltre che una catena di responsabilità non è la stessa come una catena di lavorazione. Quest'ultimo implica operazioni sequenziali (vale a dire uno pipeline) mentre il primo è gerarchico ma non necessariamente sequenziale. Qualsiasi numero e combinazione di gestori (o nessuno di loro) può agire su una singola richiesta.

Infine, suppongo che l'uso della parola "comandi" nella domanda sia un riferimento ai gestori della catena e non un riferimento allo Command Pattern. I pattern del CdR e del Comando possono essere complementari in termini di richieste alla Catena, ma tradizionalmente non in termini di Comandi come gestori.