WYKŁAD 10 Wzorce projektowe czynnociowe Command Strategy
Behavioral Design Pattern: Command [obj] Kapsułkuje dania w postaci obiektu, co umoliwia parametryzowanie klientów rónymi daniami, kolejkowanie da lub zapisywanie ich w dziennikach, a take ułatwia implementacj anulowanych operacji. Inne nazwy: Akcja, Transakcja
Uzasadnienie: Czasem istnieje potrzeba wydawania da obiektom bez jakiejkolwiek wiedzy o danej operacji lub odbiorcy dania. Przykładem mog by elementy GUI takie jak przyciski lub menu. Obiekty te s odpowiedzialne za wykonywanie da w odpowiedzi na akcje uytkownika. dania te zale jednak od zastosowania. Obiekty graficzne nie mog go zna ani nie mog go w sobie implementowa. Rozwizaniem jest przekształcenie dania w obiekt. Obiekt ten mona przekazywa. Klasa Polecenie deklaruje interfejs do rónych działa, np. jednooperacyjny Wykonaj(). Podklasy konkretne okrelaj pary odbiorca- akcja pamitajc odbiorc jako zmienn i implementujc Wykonaj() w celu wywołania dania. Odbiorca ma wiedz wymagan do spełnienia dania.
Dobrym przykładem jest implementacja Menu. Kady element menu jest obiketem klasy ElementMenu. Klasa Aplikacja tworzy menu i jego elementy wraz z reszt interfejsu uytkownika. Kontroluje ona te na bieco obiekty Dokument otwarte przez uytkownika.
Aplikacja konfiguruje kady obiekt klasy ElementMenu za pomoc obiektu podklasy konkretnej Polecenia. Gdy uytkownik wybierze ElementMenu, ten wywołuje Wykonaj() ze swojego obiektu Polecenia. Obiekty klasy ElementMenu nie wiedz której podklasy Polecenia uywaj. Podklasy Polecenia przechowuj odbiorc dania i wywołuj jedn lub wicej jego operacji.
Czasami pojawia si te konieczno wykonania całego cigu polece. Aby realizowa takie cigi polece mona zdefiniowa klas MakroPolecenie, która moe wykona nieograniczony cig polece przez ni okrelony.
Wzorzec Command rozdziela obiekt wywołujcy operacj od obiektu, który wie jak j wykona. Daje to elastyczno przy projektowaniu interfejsu uytkownika. Mona np. zapewni aby ta sama operacja była wywoływana zarówno z Menu jak i przez przycisk dziki korzystaniu przez nie z tego samego obiketu klasy konkretnej Polecenia. Polecenia mona wymienia dynamicznie, co przydaje si przy menu zalenym od kontekstu. Mona te tworzy skrypty z polece przez składanie ich z fragmentów (por. nagrywanie makr np. w aplikacjach MS Office).
Stosowalno: sparametryzowanie obiektów wykonywan akcj (jak ElementMenu) w jzykach proceduralnych odpowiada to funkcjom zwrotnym (callbacks) specyfikowanie, kolejkowanie i spełnianie da w rónym czasie mona przesyła obiekty dania do innych procesów i tam je realizowa uzgldnienia anulowania wprowadzanych zmian operacja Wykonaj() z obiektu Polecenie moe zapamita stan (lista stanów) potrzebny do cofnicia skutków jej działania przez operacj AnulujWykonanie()
umoliwienie wpisywania zmian do dziennika, tak aby w razie niepowodzenia (nawet awaria systemu) mona było je ponownie wykona konieczno dodania operacji Zapisz() i Wczytaj() do interfejsu Polecenia stworzenie systemu wokół operacji wysokiego poziomu zbudownych z operacji pierwotnych systemy transakcyjne
Struktura:
Uczestnicy: Polecenie deklaruje interfejs do wykonywania operacji PolecenieKonkretne (PolecenieWklej, PolecenieOtwórz) definiuje powizanie midzy obiektem Odbiorca i akcj implementuje operacj Wykonaj() przez wywołanie odpowiednich operacji Odbiorcy
Klient (Aplikacja) worzy obiekt klasy PolecenieKonkretne i ustala jego odbiorc Wywołujcy (ElementMenu) prosi polecenie o spełnienie dania Odbiorca (Dokument, Aplikacja) wie jak wykona operacje zwizane ze spełnieniem dania; Odbiorc moe by dowolna klasa
Współpraca: Klient tworzy obiekt PolecenieKonkretne i podaje jego odbiorc ObiektWywołujcy przechowuje obiekt PolecenieKonkretne Wywołujcy zgłasza danie, wywołujc operacj Wykonaj() Polecenia; jeli jest wycofywalne, to najpierw zapamituje stan obiekt PolecenieKonkretne wywołuje operacje swojego odbiorcy w celu spełnienia dania
Konsekwencje: Polecenie oddziela obiekt, który wywołał operacj od tego, który wie jak j wykona Polecenia s obiektami mog by przetwarzane tak jak inne obiekty z poszczególnych polece mona tworzy polecenia złoone przykład MakroPolecenie; ogólnie polecenia złoone s obiektami z wzorca Composite mona łatwo dodawa nowe polecenia bez modyfikowania istniejcych klas
Implementacja: na ile inteligentne powinno by polecenie? moliwo anulowania i przywracania operacji unikanie narastania błdów w procesie anulowania operacji stosowanie szablonów z C++
Przykłady Zastosowania Pokrewne wzorce: Composite do implementowania MakroPolecenia Memento do pamitania stanu potrzebnego do anulowania operacji Prototype Polecenie, które musi by skopiowane przed umieszczeniem go na licie działa jak Prototype
Behavioral Design Pattern: Strategy [obj] Definiuje rodzin algorytmów, kapsułkuje kady z nich i umoliwia ich wymian. Sprawia, e moliwe staje si zmienianie algorytmu niezalenie od uywajcych go klientów.
Uzasadnienie: W edytorach tekstu stosuje si wiele algorytmów dzielcych tekst na wiersze. Jednak algorytmów takich nie powinnimy umieszcza na sztywno w klasach, poniewa: klienci wymagajacy dzielenia tekstu na wiersze staj si skomplikowani róne algorytmy s odpowiednie w rónych sytuacjach, ale moemy niepotrzebowa wszystkich trudno jest dodawa lub zmienia algorytmy gdy podział na wiersze jest czci klienta
Aby unikn tych problemów moemy zdefiniowa klasy, które kapsułkuj poszczególne algorytmy podziału na wiersze. Zakapsułkowany w ten sposób algorytm nazywamy strategi.
ObiektZłoony jest odpowiedzialny za utrzymywanie i uaktualnianie przej do nowych wierszy w tekcie. Strategie podiału na wiersze nie s jednak zaimplementowane w niej, lecz oddzielnie w klasach konkretnych klasy Składacz. Podklasy konkretne klasy Składacz implementuj róne strategie.
Składacz prosty w danej chwili wyznacza jedno przejcie do nowego wiersza SkładaczTeXowy optymalizuje globalnie od razu dla całego akapitu zestaw przej do nowej linii SkładaczTablicowy tak dobiera przejcia do nowego wiersza aby kady wiersz miał tyle samo elementów
ObiektZłoony ma odwołanie do obiektu Składacz. Przy kadym formatowaniu przekazuje on odpowiedzialno do wybranego przez siebie obiektu Składacz konkretny.
Stosowalno: wiele powizanych ze sob klas róni si tylko zachowaniem strategie umoliwiaj konfigurowanie klasy za pomoc jednego z wielu zachowa potrzebne s róne warianty jakiego algorytmu w algorytmie s uywane dane, o których klient nie powinien wiedzie ukrycie ich w algorytmach kasa definiuje wiele zachowa, które w jej metodach s obłoone wielokrotnymi instrukcjami warunkowymi mona unikn objawu wskazujcego na nadmiern strukturalno kodu
Struktura:
Uczestnicy: Strategia (Składacz) deklaruje interfejs wspólny dla wszystkich obsługiwanych algorytmów; Kontekst wykorzystuje ten interfejs do wykonywania algorytmu zdefiniowanego przez StrategiKonkretn StrategiaKonkretna (SkładaczProsty, SkładaczTeXowy, SkładaczTablicowy) implementuje algorytm wykorzystujc interfejs z klasy Strategia
Kontekst (ObiketZłoony) jest konfigurowany za pomoc obiektu StrategiaKonkretna utrzymuje odwołanie do obiektu Strategia moe definiowa interfejs umoliwiajcy Strategii uzyskanie dostpu do swoich danych
Współpraca: klasy Strategia i Kontekst współdziałaj w celu zastosowania wybranego algorytmu Kontekst moe przekaza potrzebne dane albo samego siebie (wtedy moliwo odwoła zwrotnych) Kontekst przekazuje dania od klientów do swojej strategii zwykle klienci tworz obiekt StrategiaKonkretna i przekazuj go do kontekstu, a potem komunikuj si wyłcznie z kontekstem
Konsekwencje: rodziny powizanych ze sob algorytmów alternatywa dla tworzenia podklas eliminacja instrukcji warunkowych wybór implementacji klienci musz by wiadomi istnienia rónych strategii koszty zwizane z komunikacj midzy Strategi a Kontekstem zwikszona ilo obiektów rozwizaniem jest wtedy wzorzec obiektowy FlyWeight
Implementacja: definiowanie interfejsów Strategii i Kontekstu strategie jako parametry szablonów wtedy eliminacja klasy abstrakcyjnej Strategia dooprowadzenie do tego aby obiekty klasy Strategia były opcjonalne moliwo wprowadzenia domylnego zachowania Kontekstu
Przykłady Zastosowania Pokrewne wzorce: Flyweight obiekty Strategia s czsto dobrymi kandydatami na pyłki.