Command jest operacyjnym wzorcem projektowym, którego celem jest encapsulacja czynności do wykoniania i ich parametrów. W programach niektóre czynności mogą być wykonywane długo, np. odczytywanie rekordów z bazy danych. Klient, który wykonuje taką metodę na drugim obiekcie niekiedy musi czekać, aż wykonywanie tej metody się zakończy i dopiero wtedy może dalej wykonywać swój kod. Warto w takich sytuacjach skorzystać z wzorca Command. Wzorzec ten określa polecenie jako obiekt, który jest wysyłany od klienta do odbiorcy, co pozwala nam na takie funkcjonalności jak: kolejkowanie poleceń, kontrolowanie historii (nawet z operacją ‚undo’) i temu podobne.
We wzorcu tym uczestniczą aktorzy:
- Interfejs Polecenie którego implementują wszystkie konkrente Polecenia, posiadający metodę ‚wykonaj’. Jeżeli potrzeba więcej funkcjonalności, można dodać metody takie jak: ‚wycofaj’ albo ‚zapisuj w logach’.
- Konkretne polecenia, implementujące interfejs Polecenie i jego metody. W tych obiektach hermetyzowane są zadania, które muszą wykonać. Tu są również ustalane powiązania między operacjami do wykonaia a odbiorcą, który te operacje musi wykonać.
- Klient, który jest odpowiedzialny za stworzenie Polecenia (obiektu) i ustaleniu jego odbiorcy. Następnie tak utworzone pytania zostają przekazane Obiektowi Wykonującemu
- Obiekt wywołujący, który przechowuje utworzone przez Klienta Polecenie i w określonym momencie wywołuje metodę ‚wykonaj’
- Odbiorca – wie w jaki sposób wykonać operacje niezbędne do realizacji określonego żądania
Klient wysyłający polecenie, Otrzymujący polecenie , Polecenie i Pośrednik transportujący polecenie od klienta do odbiorcy.
Zobaczmy:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
public interface Polecenie { public void wykonaj(); } public class KonkretnePolecenie1 implements Polecenie{ ObiektRealizujacy obiektRealizujacy; public void wykonaj() { obiektRealizujacy.metoda1(); } public KonkretnePolecenie1(ObiektRealizujacy obiektRealizujacy) { this.obiektRealizujacy = obiektRealizujacy; } } public class KonkretnePolecenie2 implements Polecenie{ ObiektRealizujacy obiektRealizujacy; public void wykonaj() { obiektRealizujacy.metoda2(); } public KonkretnePolecenie2(ObiektRealizujacy obiektRealizujacy) { this.obiektRealizujacy = obiektRealizujacy; } } public class ObiektWywolujacy { Polecenie polecenie; public void ustawPolecenie(Polecenie polecenie) { this.polecenie = polecenie; System.out.println("Ustawiono polecenie: "+this.polecenie.getClass().getName()); } public void wykonajPolecenie() { System.out.println("Wykonuję polecenie: "+this.polecenie.getClass().getName()); polecenie.wykonaj(); } } public class ObiektRealizujacy { public void metoda1() { System.out.println("Wykonuję metodę 1... "); } public void metoda2() { System.out.println("Wykonuje metodę 2..."); } } public class Klient { public static void main(String[] args) { ObiektWywolujacy obiektWywolujacy = new ObiektWywolujacy(); ObiektRealizujacy obiektRealizujacy = new ObiektRealizujacy(); Polecenie polecenie1 = new KonkretnePolecenie1(obiektRealizujacy); Polecenie polecenie2 = new KonkretnePolecenie2(obiektRealizujacy); obiektWywolujacy.ustawPolecenie(polecenie1); obiektWywolujacy.wykonajPolecenie(); obiektWywolujacy.ustawPolecenie(polecenie2); obiektWywolujacy.wykonajPolecenie(); } } |
Diagram wzroca: