Wykład 11

Transkrypt

Wykład 11
WYKŁAD 11
Wzorce projektowe – czynno ciowe
Iterator
TemplateMethod
Behavioral Design Pattern: Iterator [obj]
Zapewnia sekwencyjny dost p do elementów
agregatu bez ujawniania jego reprezentacji
wewn trznej.
Uzasadnienie:
Obiekt zagregowany np. lista powinien zapewnia
klientowi dost p do swoich elementów bez
ujawniania swojej wewn trznej reprezentacji.
Sposoby przechodzenia elementów agregatu te
mog by ró ne i nie powinny za mieca
agregatu. Mo e by te potrzeba przechodzenia w
danej chwili elementów agregatu na kilka ró nych
sposobów.
Wzorzec Iterator rozwi zuje te wszystkie
problemy. Realizuje to poprzez
przeniesienie odpowiedzialno ci
przechodzenia elementów agragatu poza
agregat do obiektu iteratora.
Przykładem mo e by klasa Lista i
IteratorPoLi cie.
Dzi ki oddzieleniu mechanizmu przechodzenia po
obiekcie klasy Lista od samej Listy mo na
zaimplementowa w obikecie Iterator ró ne
strategie jej przechodzenia np.
Filtruj cyIteratorPoLi cie.
Przy takim rozwi zaniu jak na powy szym
diagramie klient musi wiedzie , e b dzie działał
wła nie na li cie. Idełem byłoby zapewnienie
mo liwo ci zmiany klasy-agregatu bez zmiany
klienta. Da si to zrobi wprowadzaj c iteracj
polimorficzn .
Dodajemy now klas ListaZPrzeskokami
(probabilistyka). Wprowadzamy dla obu list
nadklas abstrakcyjn ListaAbstrakcyjna
zapewniaj c wspólny interfejs do działania na
listach. Potrzebna b dzie te klasa abstrakcyjna
Iterator okre laj ca wspólny interfejs do
przechodzenia po listach. Teraz dla nadklasy
Iterator definiujemy podklasy konkretne po jednej
dla ka dego rodzaju listy.
Klient nie powinien jednak tworzy
konkretnych typów iteratorów. Lepiej aby
konkretne klasy list były odpowiedzialne za
utworzenie wła ciwego dla nich iteratora –
operacja StworzIterator() udost pniaj ca
klientowi konkretny obiekt iteratora.
Operacja ta, to przykład wzorca
projektowego FactoryMethod.
Stosowalno :
• uzyskanie dost pu do zawarto ci obiektu-agregatu
bez ujawniania jego struktury wewn trznej
• umo liwienie wielokrotnego przechodzenia
obiektów-agregatów
• zapewnienie jednakowego interfejsu
przechodzenia ró nych struktur zagregowanych
(iteracja polimorficzna)
Struktura:
Uczestnicy:
• Iterator
– definiuje interfejs dost pu do elementów
agragatu i przechodzenia ich
• IteratorKonkretny
– implementuje interfejs Iteratora
– pami ta bie c pozycj osi gni t 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 bie cy i potrafi wskaza
nast pny obiekt
Konsekwencje:
• mo liwo rozmaitego przechodzenia
agregatów
• iteratory upraszczaj interfejs Agregatu
• w danej chwili mo e si odbywa wi cej
ni jedno przechodzenie agregatu
Implementacja:
• który z uczestników steruje procesem
iteracyjnym? – iterator zewn trzny (aktywny) albo
iterator wewn trzny (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
dost p
• iteratory dla kompozytów
• iteratory puste
Przykłady
Znane zastosowania
Pokrewne wzorce:
• Composite – iteratory cz sto stosuje si do struktur
rekurencyjnych
• FactoryMethod – iteratory polimorficzne stosuj ten
wzorzec do tworzenia obiektów odpowiednich podklas
klasy Iterator
• Memento – Iterator mo e wykorzysta pami tk do
uchwycenia stanu procesu iteracyjnego. Wtedy
przechowuje pami tk wewn trznie
Behavioral Design Pattern:
TemplateMethod [cls]
Definiuje szkielet algorytmu jako operacj
przekazuj c definicj biektórych kroków
algorytmu do podklas. W ten sposób
umo liwia podklasom przedefiniowywanie
pewnych kroków algorytmu bez zmiany
jego struktury.
Uzasadnienie:
Wyobra my sobie zr b 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 zwi zane 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. Dzi ki
temu znana jest kolejno kroków
implementowanych w klasach konkretnych.
To co dzieje si w tych krokach okre laj
metody podklasy.
Stosowalno :
• jednorazowe zaimplementowanie stałej cz ci
algorytmu i pozostawienie podklasom
implementacji tej cz ci, któa mo e 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 definiuj c 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 u ycia
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 przeci anej z
nadklasy w podklasie mo na u y punktu zaczepienia
Zamiast:
void Podklasa::Operacja(){
Nadklasa::Operacja(); // mo na łatwo zapomnie
}
mo na:
void NadklasaOperacja(){
OperacjaPunktZaczepieni();
}
void Nadklasa::OperacjaPunktZaczepienia(){}
void Podklasa::OperacjaPunktZaczepienia(){
// rozszerzenie przez podklas
}
Implementacja:
• stosowanie mechanizmów sterwania
dostepem z C++
• minimalizowanie ilo ci operacji
pierwotnych
• konsekwencje dotycz ce nadawania nazw
Przykłady
Zastosowania
Pokrewne wzorce:
• FactoryMethod – jest cz sto wywoływana z metod
szablonowych
• Strategy – wykorzystuj delegowanie do
zmieniania całego algorytmu w odró nieniu od
TemplateMethod, która wykorzystuje
dziedziczenie do zmiany cz ci algorytmu