Command (Polecenie) – należy do czynnościowego wzorca projektowego
Wzorzec który ostatnio mi się spodobał. Kiedyś w pisanym edytorze rozkazy do wykonania były kolejkowane jako ENUM’y w kolejce rozkazów do wykonania. Ten wzorzec zapewnia jednak większą elastyczność poprzez:
- rozdzielenie zależności pomiędzy nadawcą i odbiorcą komunikatu
- możliwość dodanie operacji undo oraz zapamiętania stanu obiektów przed wykonaniem polecenia
- zastosowania rozkazów złożonych „wzorzec Kompozycji”
- mogą sposób wykonania polecenia uzależniać od typu odbiorcy albo nadawcy
- zastosowanie polimorfizmu pozwala na rozbudowywanie poleceń bez konieczności zmiany struktury systemu
Wadą tego wzorca jest konieczność utworzenia większej ilości obiektów co wiąże się z większym zużyciem pamięci
Wzorzec składa się z:
- Interfejsu polecenia – definiuje on operacja do wykonania, w najprostszej postaci składa się z jednej metody publicznej
- Obiektu polecenia – konkretny obiekt realizujący dane polecenie
- Klient lub grupa klientów – obiekt lub więcej obiektów na którym dane polecenie będzie wykonywać operacje
- Nadawca – obiekt tworzący polecenia i dodający do kolejki lub przekazujący do odbiorcy
- Odbiorca – obiekt pobierający polecenia i wykonujący je
Diagram wzorca „Command”:
Przykładowa implementacja:
package pl.shad.net.blog; import java.util.ArrayList; //Interfejs wzorca Command interface CommandInterface{ void run(); } //Klasy realizujące poszczególne rozkazy class Command1 implements CommandInterface{ @Override public void run(){ System.out.println("Execute command 1 ..."); } } class Command2 implements CommandInterface{ @Override public void run(){ System.out.println("Execute command 2 ..."); } } class Command3 implements CommandInterface{ @Override public void run(){ System.out.println("Execute command 3 ..."); } } // // Test wzorca Command // - dodanie rozkazów do kolejki // - wywolanie rozkazów z kolejki // public class DesignPatternsCommand{ ArrayList < CommandInterface > commandQueue = new ArrayList <>(); public static void main(String[] args){ DesignPatternsCommand ds = new DesignPatternsCommand(); ds.test(); } private void test(){ System.out.println("Add commands to queue ..."); commandQueue.add(new Command1()); commandQueue.add(new Command2()); commandQueue.add(new Command1()); commandQueue.add(new Command3()); commandQueue.add(new Command1()); System.out.println("Execute commands from queue ..."); for (CommandInterface command : commandQueue){ if (command instanceof CommandInterface){ command.run(); } } } } |
1 Pingback