2012-10-14 12 views
9

Czy klasa Invoker jest opcjonalna w strukturze wzoru polecenia? Klient musi utworzyć konkretne polecenie i odbiornik dla polecenia. Czy klient zawsze musi utworzyć instancję Invoker i przekazać obiekt polecenia do obiektu Invoker. Później, gdy klient musi wykonać polecenie, klient po prostu pyta obiekt Invoker, a Invoker wykonuje polecenie (może od razu lub może umieścić w kolejce polecenie do późniejszego wykonania).Command Design Pattern - Czy Invoker jest opcjonalny?

Czy jest na odwrót? Jeśli klient musi wykonać polecenie synchronicznie, klient odwoła się do polecenia przy użyciu interfejsu klasy podstawowej, ale utworzy instancję polecenia i odbiornika. Ilekroć klient będzie musiał wykonać polecenie, klient po prostu wywoła metodę execute na zmiennej poleceń klasy podstawowej? Kiedy będzie potrzeba dodatkowej logiki, kiedy polecenie powinno zostać wykonane, klasa Invoker będzie używana, aby zachować dodatkową logikę i klient będzie wchodził w interakcję z obiektem Invoker, aby wykonać polecenie?

Odpowiedz

6

Cele wzór polecenia są zazwyczaj 1) wprowadzić szereg różnych operacji dzielić tego samego typu, aby mogły być przetwarzane w tym samym kodzie 2) oddzielnej operacji rozrządowej/tworzenia z eksploatacji wywołania. Reciever jest wyraźnie wymagany do tego celu 2.

Jeśli zostanie wywołany zaraz po utworzeniu lub jeśli Reciever gra rolę inwokatora, nie ma osobnego, samodzielnego elementu wywołującego. Czy to oznacza, że ​​nie ma wywołanie jest naprawdę filozoficzne pytanie :)

spojrzeć na to w ten sposób: Ty/może/oddzielne tworzenia, planowania i inwokację. Nie oznacza to, że musisz je wdrożyć jako trzy oddzielne klasy. To tylko logiczne role, które są zaangażowane w cykl życia wzorca poleceń.

EDIT: Myślę, że zasada jednej odpowiedzialności twierdzi, że należy je rozdzielić, ale istnieje coś takiego jak commen sensie :) mogą i powinny być przestrzegane warunki lokalne.

1

Jak wiemy, java.lang.Runnable jest jednym z przykładów wzór komend gdzie klasa Thread pracuje jako wywołującego. Przekazujemy obiekt klasy Runnable do klasy Thread i mówimy o uruchomieniu/uruchomieniu.

Ale nigdy nie tworzymy klasy klienta, która może wywoływać główny wątek.

Zatem osoba wywołująca nie jest opcjonalna, ale nie jest ściśle powiązana z klientem. Tak więc UML wzorca polecenia nigdy nie pokazuje żadnej relacji między klasą klienta a klasą wywołania.

Innym answer związane z tym pytaniem.