Wzorce projektowe – czynnościowe Observer Visitor
Transkrypt
Wzorce projektowe – czynnościowe Observer Visitor
WYKŁAD 9 Wzorce projektowe – czynno ciowe Observer Visitor Behavioral Design Pattern: Observer [obj] Okre la relacj jeden-do-wielu mi dzy obiektami. Gdy jeden z obiektów zmienia stan, wszystkie obiekty zale ne od niego s o tym automatycznie powiadamiane i uaktualniane. Inne nazwy: Publish-Subscribe, Dependents Uzasadnienie: Cz sto mamy do czynienia z konieczno ci zaprezentowania danych z jedngo obiektu w innych obiektach na ró ne sposoby. Zalezy nam te na tym aby obiekty prezentacji nie wiedziały o sobie nawzajem, ale jednocze nie eby zachowywały si tak jakby o sobie wiedziały. Dobrym przykładem jest tu prezentowanie obiektu danych za pomoc zarówno arkusza kalkulacyjnego jak i wykresu słupkowego. Niezale nie od tego gdzie zostanie wprowadzona zmiana stanie si ona od razu widoczna we wszystkich pozostałych obiektach. Obiekty obserwowany i obserwator komunikuj si nawzajem. Gdy obserwowany zmienia stan s o tym informowani wszyscy obserwatorzy. W wyniku tego ka dy obserwator pyta obserwowanego o aktualny stan aby zsynchronizowa z nim swój własny stan. Stosowalno : • gdy jaka abstrakcja ma dwa aspekty, jeden zale ny od drugiego (np. widok od danych); kapsułkowanie tych aspektów w oddzielnych obiektach umo liwia niezale ne zmienianie i u ywanie tych obiektów w czasie wykonania • zmiana jednego obiektu wymaga zmiany innych i nie wiadomo ile obiketów trzeba zmieni • obiekt powinien by w stanie powiadamia inne obiekty nie przyjmuj c adnych zało e co do tego co te obiekty reprezentuj (eliminacja cisłego powi zania obiektów) Struktura: Uczestnicy: • Obserwowany – zna swoich obserwatorów (dowoln ilo ) – zapewnia interfejs doł czania i odł czania obserwatorów • Obserwator – definiuje interfejs uaktualniania dla obiektów, które powinny by powiadamiane o zmianach, jakie zaszły w obserwowanym • ObserwowanyKonkretny – przechowuje stan, który interesuje obiekty ObserwatorKonkretny – gdy zmienia si jego stan, wysyła powiadomienia do swoich obserwatorów • ObserwatorKonkretny – utrzymuje odwołanie do obiketu ObserwowanyKonkretny – przechowuje stan, który powinien by spójny ze stanem obserwowanego – implementuje interfejs obserwatora słu cy do uaktualniania, eby zachowa spójno swojego stanu ze stanem obserwowanego Współpraca: ObserwowanyKonkretny zawsze powiadamia swoich obserwatorów, gdy wyst pi zmiana, która mo e rozsynchronizowa stany. Po otrzymaniu powiadomienia o zmianie, która wyst piła w ObserwowanymKonkretnym, ObserwatorKonkretny mo e zapyta go o informacje dotycz ce tej zmiany. ObserwatorKonkretny u ywa tych informacji do uaktualniania swojego stanu na podstawie stanu obserwowanego. obserwowanyKonkretny obserwat orKonkret ny 1: UstawStan() 2: Powiadom() 3: Uaktualnij() 4: PodajStan() 5: Uaktualnij() 6: PodajStan() innyObserwatorKonkretny Nale y zwróci uwag na fakt, e obiekt Obserwator, który zainicjował zmian czeka z aktualizacj swojego stanu a do otrzymania powiadomienia od Obserwowanego. Operacja Powiadom nie musi by wołana przez Obserwowanego. Konsekwencje: • niezale ne zmienianie obserwatorów i obserwowanych • mo liwo ponownego wykorzystania obserwatorów bez obserwowanego i na odwrót • dodawanie obserwatorów bez modyfikowania obserwatorów ani obserwowanego • abstrakcyjne powi znie mi dzy Obserwowanym a Obserwatorem – mog by w ró nych warstwach aplikacji • wsparcie dla rozsyłania komunikatów – mo liwo usuwania obserwatorów w czasie wykonania • nieoczekiwane uaktualnienia – obserwatorzy mog nie zdawa sobie sprawy jak lawin komunikatów mog spowodowa przez uaktualnianie obserwatora Implementacja: • odwzorowywanie obserwowanych na obserwatorów – hash-table • obserwowanie wi cej ni jednego obserwowanego – w celu rozró nienia obserwowany mo e przekaza siebie • który uczestnik doprowadza do uaktualnienia – operacje wyznaczaj ce stan obserwowanego wołaj Powiadom() zaraz po zmianie stanu – klienci odpowiadaj za wołanie Powiadom() • zawieszone odwołania do usuni tych obserwowanych – powiadamianie o usuwaniu aby usun odwołania u obserwatorów • zapewnienie, e przed rozesłaniem powiadomienia stan obserwowanego jest spójny – aby tego unikn mo na wysyła powiadomienie z TemplateMethod w klasach abstrakcyjnych Obserwowanego • unikanie protokołów uaktualniania specyficznych dla obserwatora: modele pchaj cy (obserwowany wysyła szczegółow informacj o zmianie) i ci gn cy (obserwatorzy pytaj o interesuj ce ich szczegóły; wi ksze ponowne u ycie, ale mniejsza efektywno ) • jawne specyfikowanie modyfikacji wartych uwagi – ró ni obserwatorzy mog by zainteresowani ró nymi zmianami, wtedy rejestruj si wraz ze swoim aspektem • kapsułkowanie zło onej semantyki uaktualnie – klasa Zarz dcaZmian • ł czenie klas Obserwowany i Obserwator – wspólny interfejs dla obu klas w j zykach bez wielodziedziczenia, wtdy obiekt implementuj cy ten interfejs mo e działa w ka dej z ról Przykłady Zastosowania Pokrewne wzorce: • Mediator – kapsułkuj c zło on sematyk zmian klasa Zarz dcaZmian działa jako Mediator mi dzy obserwatorami a obserwowanymi • Singleton – klasa Zarz dcaZmian mo e by Singletonem Behavioral Design Pattern: Visitor [obj] Okre la operacj , któa ma by wykonana na elementach struktury obiektowej. Umo liwia definiowanie nowej operacji bez modyfikowania klas elementów, na których ona działa. Uzasadnienie: Przykładem jest kompilator, który reprezentuje programy w postaci drzew składni abstrakcyjnej. Musi on przeprowadza analiz semantyczn (np. sprawdza czy wszystkie zmienne s zdefiniowane). Musi tak e generowa kod. Na takim drzewie mo emy wykonywa cały szereg operacji. Operacje te powinny inaczej traktowa w zły reprezentuj ce instrukcje, inaczej w zły reprezentuj ce zmienne, wyra enia arytmtyczne… B d wi c dla nich osobne klasy. Zbiór tych klas zale y od j zyka programowania, ale słabo. Teraz chodzi nam o to, aby mo na było umieszcza nowe operacje bez konieczno ci modyfikowania całej hierarchii i bez umieszczania w klasach kodu, który zajmuje si zupełnie ró nymi zagadnieniami (np. generowanie kodu, ładne drukowanie kodu) – w ten sposób kompilator b dzie ułatwiał wprowadzanie zmian. Osi gniemy te cele je li wszystkie te operacje wyprowadzimy poza hierarchi umieszczaj c je w osobnych klasach. Obiekty tych osobnych klas nosz nazw odwiedzaj cych. Odwiedzaj cych mo na przekaza do elementów hierarchii. W momencie przekazania odwiedzaj cego element hierarchii mo e przekaza samego siebie do odwiedzaj cego, który wykona na nim operacj . T operacj , która dawniej znajdowała si w elemencie hierarchii. W ywniku zastosowania tego wzorca otrzymujemy dwie hierarchie klas – jedn dla w złów i drug dla odwiedzaj cych. Nowe operacje tworzymy przez dodawanie nowych podklas w hierarchii odwiedzaj cych. Dopóki nie zmieni si hierarchia w złów mo emy dodawa w ten sposób nowe operacje. Stosowalno : • struktura obiektowa zawiera wiele klas obiektów z ró nymi interfejsami i chcemy wykonya na nich operacje zale ne od ich klas konkretnych • wiele ró nych niepowi zanych ze sob operacji musi by wykonanych na obiektach struktury, a nie chcemy zanieczyszcza tej struktury tymi operacjami – szczególnie przydatne dla współdzielonych struktur • klasy definiuj ce struktur obiektow rzadko si zmieniaj a chcemy cz sto definiowa nowe operacje w tej strukturze – zmiany w strukturze wymuszaj zmiany całego interfejsu odwiedzaj cych Uczestnicy: • Odwiedzaj cy (Odwiedzaj cyW zły) – deklaruje operacj Odwiedz() dla ka dej klasy ElementKonkretny w strukturze obiektowej; nazwa i syngatura operacji okre laj klas , która wysyła danie Odwied () do Odwiedzaj cego; dzi ki temu Odwiedzaj cy mo e ustali klas i skorzysta z jej interfejsu • Odwiedzaj cyKonkretny (Odwiedzaj cySprawdzaj cyTypy) – implementuje ka d z operacji zadeklarowanych przez Odwiedzaj cego, kazda z operacji definiuje fragment algorytmu zdefiniowanego dla odpowiedniej klasy obiektu w strukturze; Odwiedzaj cyKonkretny zapewnia kontekst dla algorytmu i przechowuje jego stan lokalny; stan ten cz sto kumuluje wyniki uzyskane podczas przechodzenia struktury • Element (W zeł) – definiuje operacj Przyjmij, otrzymuj c odwiedzaj cego jako argument • ElementKonkretny (W zełPrzypisanie, W zełOdwołanieDoZmiennej) – implementuje operacj Przyjmij, która otrzymuje odwiedzaj cego jako argument • StrukturaObiektowa (Program) – mo e poda swoje elementy – mo e zapewni wysokopoziomowy interfejs umo liwiaj cy odwiedzaj cemu odwiedzenie elementów – mo e by wzorcem Composite lub kolekcj Współpraca: • klient musi tworzy obiekt Odwiedzaj cyKonkretny, a nast pnie przej struktur obiektow odwiedzaj c ka dy element za pomoc odwiedzaj cego • gdy element jest odwiedzany wywołuje operacj Odwiedzaj cego odpowiedni dla swojej klasy; dostarcza on siebie samego jako argument tej operacji, eby umo liwi odwiedzaj cemu dost p do swojego stanu strukturaObiektowaA elementKonkretnyA elementKonkretnyB odwiedzaj cyKonkretny 1: Przyjmij(odwiedzaj cy) 2: Odwied ElementKonk ret nyA(elementKonkretnyA) 3: OperacjaA() 4: Przyjmij(odwiedzaj cy) 5: Odwied ElementKonkretnyB(elementKonkretnyB) 6: OperacjaB() Konsekwencje: • łatwe dodawanie nowych operacji • zebranie razem powi zanych ze sob operacji a rozdzielenie niepowi zanych • trudne dodawanie nowych klas ElementKonkretny • odwiedzanie całej hierarchii klas - lepiej ni iterator, bo mo e działa na ró nych typach • kumulowanie stanu • naruszanie kapsułkowania – operacje dost pu do stanu obiketów klasy ElementKonkretny Implementacja: • wywoływanie dwukrotne • który z uczestników jest odpowiedzialny za przechodzenie struktury obiektowej? Przykłady Zastosowania Pokrewne wzorce: • Composite – mo na odwiedza hierarchi kompozytu • Interpreter – zastosowanie do interpretowania