Polecenie (ang. Command) (wzorzec behawioralny) enkapsuluje żądanie wykonania określonej czynności (metody) do postaci obiektu zwanego Poleceniem. Obiekty mogą być parametryzowane w zależności od typu odbiorcy oraz rejestrowane w kolejkach wywołań czy też dziennikach zdarzeń. Klasy wywołujące polecenia są rozdzielone od klas, które je wykonują dzięki czemu obiekt wywołujący (Invoker) operacje (Command) nie musi nic wiedzieć na jej temat, ponieważ wszystkie informacje zawarte są w przekazanym obiekcie. Invoker wywołuje odpowiedni obiekt Command bez wiedzy nt sposobu jego działania, natomiast obiekt Command dostarcza implementacji żądanej operacji bez wiedzy o tym kiedy zostanie wywołana.
Ograniczenia
Zwiększa poziom skomplikowania kodu z uwagi na dużą ilość dodatkowych klas. Zapewniając możliwość cofania operacji należy liczyć się ze zwiększonym zużyciem zasobów pamięci.
Użycie
Wzorzec Polecenie wykorzystywany jest w sytuacjach, gdzie obiekt wywołujący operacje nie zna jej implementacji oraz argumentów, a jego odpowiedzialnością jest wywołanie właściwego polecenia w odpowiednim momencie (może być odroczone w czasie). Ponadto znajduje zastosowanie, gdy wymagane jest kolejkowanie lub śledzenie żądań.
Implementacja
Klasa Invoker decyduje o wyborze właściwego obiektu Command na którym wywołuje polecenie. W przypadku wymaganego kolejkowania bądź dziennika zdarzeń dodatkowo zarządza kolekcją poleceń. Klasy poleceń Command1, Command2 implementują interfejs Command poprzez delegowanie wykonania operacji do obiektu pomocniczego Receiver. Jednakże w niektórych przypadkach obiekt Receiver jest pomijany, a implementacja operacji spoczywa wyłącznie na klasie polecenia.
Poniższy listing przedstawia sposób wywołania operacji przy użyciu wzorca Polecenie.
Klient w odpowiedzi na zdarzenie przekazuje odpowiedni obiekt polecenia.
Przykład
Aplikacja bankowa BankOnline pozwala swoim klientom na wykonywania podstawowych operacji informacyjnych takich jak sprawdzanie stanu konta, wyciągów czy podsumowań. Za pośrednictwem aplikacji klient może również dokonać przelewu, zlecić operacje stałe czy wziąć pożyczkę. Operacje finansowe w zależności od ustawień użytkownika wymagają opcjonalnej autoryzacji. Klient może autoryzować każdą operacje pojedynczo lub wykonać autoryzację zbiorczą. Ze względu na możliwość tworzenia operacji i ich późniejszego zbiorczego wykonania użyty został wzorzec Polecenie.
Klient przechodzi do ekranu zlecania operacji na którym wprowadza dane i zleca ich wykonanie.
Biblioteki
Klasa Thread oraz Runnable standardowego pakietu Java są przykładem implementacji wzorca Polecenie.