WYKŁAD 11 Wzorce projektowe czynnociowe Iterator TemplateMethod
Behavioral Design Pattern: Iterator [obj] Zapewnia sekwencyjny dostp do elementów agregatu bez ujawniania jego reprezentacji wewntrznej.
Uzasadnienie: Obiekt zagregowany np. lista powinien zapewnia klientowi dostp do swoich elementów bez ujawniania swojej wewntrznej reprezentacji. Sposoby przechodzenia elementów agregatu te mog by róne i nie powinny zamieca agregatu. Moe by te potrzeba przechodzenia w danej chwili elementów agregatu na kilka rónych sposobów.
Wzorzec Iterator rozwizuje te wszystkie problemy. Realizuje to poprzez przeniesienie odpowiedzialnoci przechodzenia elementów agragatu poza agregat do obiektu iteratora. Przykładem moe by klasa Lista i IteratorPoLicie.
Dziki oddzieleniu mechanizmu przechodzenia po obiekcie klasy Lista od samej Listy mona zaimplementowa w obikecie Iterator róne strategie jej przechodzenia np. FiltrujcyIteratorPoLicie. Przy takim rozwizaniu jak na powyszym diagramie klient musi wiedzie, e bdzie działał włanie na licie. Idełem byłoby zapewnienie moliwoci zmiany klasy-agregatu bez zmiany klienta. Da si to zrobi wprowadzajc iteracj polimorficzn.
Dodajemy now klas ListaZPrzeskokami (probabilistyka). Wprowadzamy dla obu list nadklas abstrakcyjn ListaAbstrakcyjna zapewniajc wspólny interfejs do działania na listach. Potrzebna bdzie te klasa abstrakcyjna Iterator okrelajca wspólny interfejs do przechodzenia po listach. Teraz dla nadklasy Iterator definiujemy podklasy konkretne po jednej dla kadego rodzaju listy.
Klient nie powinien jednak tworzy konkretnych typów iteratorów. Lepiej aby konkretne klasy list były odpowiedzialne za utworzenie właciwego dla nich iteratora operacja StworzIterator() udostpniajca klientowi konkretny obiekt iteratora. Operacja ta, to przykład wzorca projektowego FactoryMethod.
Stosowalno: uzyskanie dostpu do zawartoci obiektu-agregatu bez ujawniania jego struktury wewntrznej umoliwienie wielokrotnego przechodzenia obiektów-agregatów zapewnienie jednakowego interfejsu przechodzenia rónych struktur zagregowanych (iteracja polimorficzna)
Struktura:
Uczestnicy: Iterator definiuje interfejs dostpu do elementów agragatu i przechodzenia ich IteratorKonkretny implementuje interfejs Iteratora pamita biec pozycj osignit przy przechodzeniu agregatu
Agregat definiuje interfejs tworzenia obiketówiteratorów AgregatKonkretny implementuje interfejs tworzenia Iteratora tak, aby przekazywał egzemplarz odpowiedniego IteratoraKonkretnego
Współpraca: Klasa IteratorKonkretny ledzi, który obiekt w agregacie jest biecy i potrafi wskaza nastpny obiekt
Konsekwencje: moliwo rozmaitego przechodzenia agregatów iteratory upraszczaj interfejs Agregatu w danej chwili moe si odbywa wicej ni jedno przechodzenie agregatu
Implementacja: który z uczestników steruje procesem iteracyjnym? iterator zewntrzny (aktywny) albo iterator wewntrzny (pasywny) który z uczestników definiuje algorytm przechodzenia? na ile iterator jest odporny? dodatkowe operacje Iteratora
stosowanie iteratorów polimorficznych w C++ iteratory mog mie uprzywilejowany dostp iteratory dla kompozytów iteratory puste
Przykłady Znane zastosowania Pokrewne wzorce: Composite iteratory czsto stosuje si do struktur rekurencyjnych FactoryMethod iteratory polimorficzne stosuj ten wzorzec do tworzenia obiektów odpowiednich podklas klasy Iterator Memento Iterator moe wykorzysta pamitk do uchwycenia stanu procesu iteracyjnego. Wtedy przechowuje pamitk wewntrznie
Behavioral Design Pattern: TemplateMethod [cls] Definiuje szkielet algorytmu jako operacj przekazujc definicj biektórych kroków algorytmu do podklas. W ten sposób umoliwia podklasom przedefiniowywanie pewnych kroków algorytmu bez zmiany jego struktury.
Uzasadnienie: Wyobramy sobie zrb do tworzenia aplikacji. Ma on klasy Aplikacja i Dokument. Aplikacja odpowiada za otwieranie dokumentów, a Dokument reprezentuje informacje o dokumencie wczytanym z pliku. Z klas tych dziedzicz klasy konkretne zwizane z poszczególnymi dziedzinami zastosowa (edytor graficzny, arkusz kalkulacyjny).
Metoda OtwórzDokument() definiuje szablon algorytmu otwierania dokumentu rozbity na abstrakcyjne kroki przeznaczone do zaimplementowania w podklasach. Dziki temu znana jest kolejno kroków implementowanych w klasach konkretnych. To co dzieje si w tych krokach okrelaj metody podklasy.
Stosowalno: jednorazowe zaimplementowanie stałej czci algorytmu i pozostawienie podklasom implementacji tej czci, któa moe si zmienia potrzeba zastosowania refaktoryzacji w celu uogólnienia umiesczenie wspólnego zachowania podklas w nadklasie kontrolowanie rozszerzania klas wprowadza tzw. operacje-punkty zaczepienia w zadanych miejscach kodu
Struktura:
Uczestnicy: KlasaAbstrakcyjna (Aplikacja) definiuje abstrakcyjne operacje pierwotne przedefiniowywane przez podklasy w celu zaimplementowania kroków algorytmu implementuje metod szablonow definiujc szkielet algorytmu, która wywołuje operacje pierwotne oraz inne operacje KlasaKonkretna implementuje operacje pierwotne w celu wykonania kroków algorytmu specyficznych dla danej klasy
Współpraca: KlasaKonkretna polega na KlasieAbstrakcyjnej w kwestii implementacji niezmiennych kroków algorytmu.
Konsekwencje: podstawowa technika zagwarantowania ponownego uycia kodu wydzielanie wspólnego zachowania w klasach bibliotecznych wprowadzanie odwróconej struktury sterowania zw. zasad z Hollywood - nie dzwo do nas, my zadzwonimy do ciebie (nadklasa wywołuje operacje podklasy) wydziela si operacje które mog by przedefiniowane (punkty zaczepienia) oraz operacje, które musz by przedefinowane (operacje pierwotne) aby nie zapomnie o wywołaniu metody przecianej z nadklasy w podklasie mona uy punktu zaczepienia
Zamiast: void Podklasa::Operacja(){ Nadklasa::Operacja(); // mona łatwo zapomnie } mona: void NadklasaOperacja(){ OperacjaPunktZaczepieni(); } void Nadklasa::OperacjaPunktZaczepienia(){} void Podklasa::OperacjaPunktZaczepienia(){ // rozszerzenie przez podklas }
Implementacja: stosowanie mechanizmów sterwania dostepem z C++ minimalizowanie iloci operacji pierwotnych konsekwencje dotyczce nadawania nazw
Przykłady Zastosowania Pokrewne wzorce: FactoryMethod jest czsto wywoływana z metod szablonowych Strategy wykorzystuj delegowanie do zmieniania całego algorytmu w odrónieniu od TemplateMethod, która wykorzystuje dziedziczenie do zmiany czci algorytmu