WYKŁAD 13 Wzorce projektowe czynnociowe Chain of Responsibility Interpreter Memento
Behavioral Design Pattern: Chain of Responsibility [obj] Umoliwia uniknicie zwizania wysyłajcego danie z odbiorc dania przez danie wicej ni jednemu obiektowi szansy obsłuenia tego dania. Tworzy łacuch odbierajcych obiektów i przekazuje wzdłu niego danie, a jaki obiekt je obsłuy.
Uzasadnienie: Skoncentrujemy si na systemie pomocy kontekstowej w GUI. W zalenoci od tego, który element GUI zostanie wybrany przez uytkownika, wyswietli si stosowne objanienie dla tego elementu i dla jego aktualnego kontekstu. Jeli dla jakiego elementu brakuje w systemie objanienia, to powinno zosta wywietlone objasnienie ogólne, np. specyficzne dla kontenera.
W ten sposób zaznacza si konieczno uporzdkowania objanie wg stopnia ich ogólnoci. Obiekt, który ma dostarczy objanienia nie jest znany obiektowi graficznemu. Rozwizaniem jest tu stworzenie łacucha obiektów dostarczajcych objanie, poprzez który przejdzie danie pochodzce od obiektu graficznego.
Klasy Przycisk, Dialog i Aplikacja wykorzystuj metody z klasy ObsługaPomocy do reagowania na danie wywietlenia objanie. Metoda ObsłuPomoc() z tej klasy domylnie przekazuje danie obsłuenia pomocy do swojego nastpnika.
Stosowalno: wicej ni jeden obiekt moe obsłuy danie, a obiekt obsługujcy nie jest znany (powinien by on ustalany automatycznie) potrzeba wysłania dania do jednego z kilku obiektów bez jawnego okrelania właciwego odbiorcy zbiór obiektów, które mog obsłuy danie powinien by okrelony dynamicznie Struktura:
Uczestnicy: Obsługa (ObsługaPomocy) definiuje interfejs obsługi da moe implementowa odwołanie do nastpnika ObsługaKonkretna (PrzyciskDrukuj, DialogDrukowanie) obsługuje te dania, za spełnienie których odpowiada moe mie dostp do swojego nastpnika Klient generuje danie i przesyła je do obiektu klasy ObsługaKonkretna, wystpujcego w łacuchu
Współpraca: Gdy klient wysyła danie, jest ono przesyłne wzdłu łacucha, a jaki obiekt klasy ObsługaKonkretna wemie na siebie obowizek spełnienia go. Konsekwencje: zredukowanie powiza dodatkowa elastyczno w przydzielaniu obiektom zobowiza brak gwarancji odebrania dania
Implementacja: implementacja łacucha nastpników łczenie nastpników reprezentowanie da Przykłady Znane zastosowania
Pokrewne wzorce: Composite rodzic komponentu moe odgrywa rol jego nastpnika
Behavioral Design Pattern: Interpreter [cls] Definiuje reprezentacj dla gramatyki zadanego jzyka, a take interpreter, który wykorzystuje t reprezentacj do interpretowania zda w zadanym jzyku.
Uzasadnienie: Czsto powtarzajcy si problem czasem warto opisa przy pomocy jakiego jzyka. Wyraenia tego jzyka s nastpnie interpretowane. Aby mogło do tego doj konieczne jest zdefiniowanie gramatyki. Wzorzec ten wykorzystuje klasy do reprezentowania kadej reguły gramatycznej.
Rozwamy np. gramtyk regularn: G=(S,N,T,P) gdzie: S = wyraenie N = {wyraenie, wybór, sekwencja, powtórzenie, literał} T = {a,b,c,d,,*,&, (,)}
P: wyraenie -> literał wyraenie -> wybór wyraenie -> sekwencja wyraenie -> ( wyraenie ) wybór -> wyraenie wyraenie sekwencje -> wyraenie & wyraenie powtórzenie -> wyraenie * literał -> a b c {a b c }*
Abu utworzy interpreter wystarczy zdefiniowa metod Interpretuj() w podklasach i przekaza jej kontekst (dane wejciowe i informacja jak dua cz został dopasowana do wzorca)
Stosowalno: Stosuje si go gdy istnieje jzyk nadajcy si do interpretowania i gdy zdania w tym jzyku mona reprezentowa jako drzewo składni abstrakcyjnej. Ponadto gdy: gramatyka jest prosta (gdy jest skomplikowana, to generatory analizatorów) efektywno nie jest bardzo wana (gramatyki regularne jako maszyny stanu wtedy te mona uy tego wzorca) Struktura:
Uczestnicy: WyraenieAbstrakcyjne (WyraenieRegularne) deklaruje operacj abstrakcyjn Interpretuj() wspóln dla wszystkich wzłów w drzewie składni abstrakcyjnej WyraenieKocowe (WyraenieLiterał) implementuje operacj Interpretuj() zwizan z symbolami terminalnymi dla kadego symbolu terminalnego jest wmagany jedna instancja
WyraeniePomocnicze (WyraenieWybór, WyraeniePowtórzenie, WyraenieSekwencja) jedna instancja dla kadej produkcji gramatyki utrzymuje zmienne egzemplarzowe typu WyraenieAbstrakcyjne dla kadego z symboli prawej strony produkcji implementuje operacje Interpretuj() dla symboli nieterminalnych w gramatyce, zwykle wywołuje si j rekurencyjnie na zmiennych egzemplarzowych
Kontekst zawiera globalne informacje dla interpretera Klient buduje (lub dostaje) drzewo składni abstrakcyjnej dla zdania na wejciu wywołuje operacj Interpretuj()
Współpraca: Klient buduje lub otrzymuje zdanie w postaci drzewa składni abstrakcyjnej złoonego z instancji kals WyraeniePomocnicze i WyraenieKocowe, nastpnie inicjuje kontekst i wywołuje operacj Interpretuj() kady wzeł bdcy WyraeniemPomocniczym definiuje operacj Interpretuj() w kategoriach tej operacji wywołanej dla kadego z podwyrae tego wyraenia; operacja Interpretuj() kadgo WyraeniaKocowego definiuje podstawowy przypadek rekursji operacje Interpretuj() z kadego wzła wykorzystuj kontekst do przechowywania stanu interpretera i uzyskiwania dostpu do niego
Konsekwencje: łatwe zmienianie i rozszerzanie gramatyki łatwa implementacja gramatyki trudne utrzymywanie złoonej gramatyki moliwo dodawania nowych sposobów interpretowania wyrae
Implementacja: tworzenie drzewa składni abstrakcyjnej definiowanie operacji Interpretuj() współdzielenie symboli kocowych za pomoc wzorca Flyweight Przykłady Zastosowania
Pokrewne wzorce: Composite drzewo składni abstrakcyjnej to przykład zastosowania wzorca Composite Flyweight wskazuje jak współdzieli symbole terminalne w obrebie składni abstrakcyjnej Iterator moe by wykorzystywany do przechodzenia struktury Visitor moe by zastosowany do zrealizowania w jednej klasie działa okrelonych w kadym wle drzewa składni abstrakcyjnej
Behavioral Design Pattern: Memento [obj] Nie naruszajc kapsułkowania zapamituje i udostpnia na zewntrz stan wewntrzny obiektu, tak, e obiekt moe by póniej przywrócony do zapamitanego stanu.
Uzasadnienie Czasami bywa konieczne zapamitanie wewntrznego stanu obiektów w celu wycofania si z przeprowadzonych operacji. Zwykle obiekty kapsułkuj swój stan czynic go niedostpnym a tym samym uniemoliwiajc zapisanie go na zewntrz.
Edytor graficzny uwzgldniajcy połczenia obiektów. Np. mamy dwa prostokty połczone odcinkiem prostej. W trakcie przesuwania jednego z prostoktów bd one nadal połczone ze sob. Klasa RozwizywaczOgranicze zapamituje połczenia w trakcie tworzenia ich i generuje opisujce je równania matematyczne, które rozwizuje przy zmianie na diagramie. Nastpnie klasa ta wykorzystuje wyniki oblicze do przesuwania odcinka. Implementacja anulowania operacji nie jest taka prosta w tym przykładzie.
Interfejs klasy RozwizywaczOgranicze moe nie wystarcza do wykonania operacji odwrotnej. Zapamitywanie ostatniego przemieszczenia moe by niedobre ze wzgldu na błdy oblicze. Przydatny moe si tu okaza wzorzec Memento. Pamitka jest obiektem przechowujcym migawk wewntrznego stanu innego obiektu jej ródła. Mechanizm anulowania prosi ródło o pamitk kiedy chce ustawi punkt kontrolny stanu ródła. ródło inicjuje pamitk informacjami opisujcymi jego stan biecy.
ródłem jest w przykładzie RozwizywaczOgranicze. Anulowanie operacji: 1. Edytor prosi klas RozwizywaczOgranicze o pamitk jako efekt uboczny operacji przesuwania. 2. Klasa RozwizywaczOgranicze tworzy i przekazuje pamitk, któr jest obiekt klasy StanRozwizywacza. Pamitka ta zawiera struktury danych opisujce biecy stan wewntrznych równa i zmiennych obiketu klasy RozwizywaczOgranicze. 3. Kiedy uytkownik anuluje operacj przesuwania edytor przekazuje StanRozwizywacza z powrotem do RozwizywaczaOgranicze. 4. Klasa RozwizywaczOgranicze odtwarza swój stan.
Stosowalno: trzeba zapamita migawkstanu obiektu (lub czci stanu), tak aby mona go było potem przywróci do tego stanu oraz bezporedni interfejs do uzyskania stanu ujawniałby szczegóły implementacji i naruszałby hermetyzacj obiektu
Uczestnicy: Pamitka (StanRozwizywacza) przechowuje potrzebn cz stanu wewntrznego obiektu ródło chroni stan przed dostpem innych obiektów dwa róne interfejsy ródło (RozwizywaczOgranicze) tworzy pamitk zawierajc migawk swojego biecego stanu wewntrznego wykorzystuje pamitk do odtworzenia swojego stanu wewntrznego
Opiekun (mechanizm anulowania) jest odpowiedzialny za opiek nad pamitk nigdy nie wykonuje operacji na pamitce ani nie bada jej zawartoci
Współpraca: Opiekun prosi ródło o pamitk, przez jaki czas j przechowuje, a nastpnie zwraca ródłu pamitki s pasywne jedynie ródło bdzie przypisywa lub odtwarza stan pamitki
Konsekwencje: zachowanie granic kapsułkowania uproszczenie ródła uycie pamitek moe by kosztowne definiowanie zawonych i szerokich interfejsów ukryte koszty zwizane z opiek nad pamitkami
Implementacja: wsparcie ze strony jzyka przechowywanie zmian przyrostowych
Przykłady Znane zastosowania Pokrewne wzorce Command polecenia mog uywa pamitek do pamitania stanu w wypadku wycofywanych operacji Iterator pamitek mona uywa do obsługi procesu iterowania