5

Dlaczego potrzebuję użyć łańcucha odpowiedzialności, gdybym mógł załadować wszystkie polecenia do jakiegoś kontenera i po prostu wykonywać komendy jeden po drugim. Spowoduje to utworzenie łańcucha przetwarzania żądania z rzędu. BTW Uważam, że jest lepszy niż KR, ponieważ można usunąć niektóre konkretne polecenia lub zastąpić je innym poleceniem w środowisku wykonawczym, natomiast w przypadku KR-u trzeba utworzyć kolejny łańcuch, aby zmienić coś w łańcuchu, ponieważ nie masz dostępu do elementów w łańcuchu. łańcuch, z wyjątkiem pierwszego elementu. (Jest to faktycznie pojedyncza lista powiązane.)Łańcuch odpowiedzialności kontra polecenia w kolejce lub stosie

Odpowiedz

1

Wystarczy "keep it simple głupie" :-)

utworzyć kolejkę/stosu podczas specjalnie potrzebne, a nie wiesz, kiedy jest to potrzebne , prawda?

Na przykład- jeśli trzeba było zrobić kilka prostych manipulacji danymi jak:

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

vs

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

również zauważyć, że muszę napisać więcej kodu, aby utworzyć nową strukturę danych (polecenia stos).

Ale powiedzmy, że było to coś bardziej strategicznego, np. Strzelanka. Gracz może zostać zastrzelony, itd., A wyniki zależą od wybranego poziomu trudności gry.

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); 
}; 

Zauważmy, że w tym przypadku musieliśmy stworzyć strategię, która może być przekazywana i zdarzać się w czasie wykonywania.

Tak więc w trybie łatwym bodyShot może nie mieć ostatniego elementu (LooseHealth), a headShot może mieć LooseHealth zamiast KillPlayer jako ostatni element.

Mam nadzieję, że to pomaga.

+0

Który z nich jest prosty? COR lub stos? Dla mnie obaj są tym samym sh * t. – Narek

+0

ok, zobacz poprawioną odpowiedź powyżej – Nishant

+0

Porównano stos ze statycznym 'data.clean(). Format(). Save();'. Ale pytałem stack vs COR, ponieważ zmiany środowiska wykonawczego można wykonać w obu, tak jak w COR można tworzyć nowe łańcuchy. – Narek

0

Nie sądzę, że KR potrzebuje pojedynczo połączonej listy. To może być powszechna realizacja; ale można użyć listy podwójnie połączonej lub praktycznie dowolnej innej kolekcji/kontenera, o ile oddziela nadawcę wiadomości od odbiornika (-ów). To, co opisujesz, brzmi idealnie pasujące do wzoru KR-u. Po prostu zwiększyłeś możliwość konfigurowania łańcucha. Ważne jest, aby pamiętać, że GoF definition poucza nas do realizacji łańcucha

bez twardego okablowania relacji przewodnika i pierwszeństwa,

... ale nie sądzę, że należy ograniczyć nasz wybór kolekcja dla handlerów.


Należy również zauważyć, że Łańcuch Odpowiedzialności to nie to samo, co łańcuch przetwarzania. Ta ostatnia implikuje operacje sekwencyjne (to jest pipeline), podczas gdy pierwsza z nich jest hierarchiczna, ale niekoniecznie sekwencyjna. Każda liczba i kombinacja programów obsługi (lub żadnego z nich) może działać na pojedynczym żądaniu.

Wreszcie zakładam, że użycie słowa "polecenia" w pytaniu jest odniesieniem do procedur obsługi w łańcuchu, a nie odniesieniem do Command Pattern. Wzory KR-u i Komend mogą być komplementarne pod względem żądań do Łańcucha, ale tradycyjnie nie w odniesieniu do Poleceń jako osób zajmujących się obsługą.