Odpowiadając na bardzo stare pytanie. (czy ktoś widzi najnowsze odpowiedzi zamiast większości głosów?)
Jest to uzasadnione zamieszanie z powodu podobieństw. Zarówno strategie, jak i polecenia wykorzystują hermetyzację . Ale to nie czyni ich takimi samymi.
Kluczową różnicą jest zrozumienie, co jest hermetyzowane. Zasada OO, od której zależą oba wzorce, to Hermetyzuj to, co się zmienia .
W przypadku strategii różni się algorytm . Na przykład jeden obiekt strategii wie, jak wyprowadzić dane do pliku XML, podczas gdy drugi wyprowadza, powiedzmy, JSON. Różne algorytmy są przechowywane ( zamknięte ) w różnych klasach. To takie proste.
W przypadku polecenia, to, co się różni, to samo żądanie . Żądanie może pochodzić z adresu File Menu > Delete
lub Right Click > Context Menu > Delete
lub Just Delete Button pressed
. We wszystkich trzech przypadkach można wygenerować 3 obiekty poleceń tego samego typu. Te obiekty poleceń reprezentują tylko 3 żądania usunięcia; nie algorytm usuwania. Ponieważ żądania to teraz kilka obiektów, moglibyśmy łatwo nimi zarządzać. Nagle zapewnienie funkcji, takich jak cofanie lub ponawianie, stało się trywialne.
Nie ma znaczenia, w jaki sposób polecenie implementuje żądaną logikę. Podczas wywoływania funkcji execute () może zaimplementować algorytm wyzwalający usunięcie lub nawet delegować go do innych obiektów, a nawet delegować do strategii. To tylko szczegół implementacji wzorca polecenia. Dlatego nazywa się go poleceniem, chociaż nie jest to uprzejmy sposób na żądanie : -)
Porównaj to ze strategią; ten wzorzec dotyczy tylko rzeczywistej logiki, która jest wykonywana. Jeśli to zrobimy, pomoże to osiągnąć różne kombinacje zachowań przy minimalnym zestawie klas, zapobiegając w ten sposób eksplozji klas.
Myślę, że Command pomaga nam poszerzyć naszą wiedzę na temat hermetyzacji, podczas gdy strategia zapewnia naturalne wykorzystanie hermetyzacji i polimorfizmu.