WZORCE PROJEKTOWE STRUKTURALNE

Transkrypt

WZORCE PROJEKTOWE STRUKTURALNE
WZORCE PROJEKTOWE
STRUKTURALNE
Omówimy (W6-W8):
• Decorator
• Composite
• Adapter
• Bridge
• Facade
• Proxy
WYKŁAD 6
Wzorce projektowe – strukturalne
Decorator
Composite
Structural Design Pattern: Decorator
Dynamicznie doł cza do obiektów dodatkowe
zobowi zania. Zapewnia elastyczn
alternatyw dla tworzenia podklas w celu
rozszerzania funkcjonalno ci.
Inne nazwy:
Opakowanie (Wrapper)
Uzasadnienie stosowania:
Czasami chcemy doł czy pewne
zobowi zania do niektórych obiektów a nie
całych klas. Np. dodanie ramek i pasków
przewijania do składników GUI.
Dziedziczenie jest kłopotliwe – statyczny
wybór ramki, na dodatek dla ka dego
elementu.
Lepszym rozwi zaniem jest umieszczenie
obiektu dekorowanego (element GUI)
wewn trz obiektu dekorujacego (ramka,
scrollbars).
Dekorator dostosowuje si do interfejsu
dekorowanego obiektu staj c si
prze roczystym dla klienta obiektu
dekorowanego.
Dekorator przekazuje dania do obiektu
dekorowanego i mo e wykonywa
dodatkowe operacje przed lub po
otrzymaniu dania. Prze roczysto ta
umo liwia rekurencyjne zagnie d anie
dekoratorów.
Mamy obiekt klasy WidokTekstowy wy wietlaj cy
tekst w okienku. Standardowo nie ma on
suwaków. Mo emy je doda za pomoc
DekoratorZSuwakami. Ramk mo emy doda za
pomoc DekoratoraZRamkami. Klasy
DekoratorZSuwakami i DekoratoraZRamkami s
podklasami abstrakcyjnej klasy Dekorator
reprezentuj cej komponenty wizulane, które
ozdabiaj inne komponenty wizualne.
KomponentWizualny
+komponent
Rysuj()
WidokTekstowy
Dek orator
Rysuj()
Rysuj()
komponent->Ry suj();
DekoratorZSuwakami
DekoratorZRamkami
pozycjaSuwaka
szerokoscRamki
Rysuj()
PrzewinDo()
Rysuj()
RysujRamke()
Dekorator::Rysuj();
RysujRamke();
Klasa Dekorator przesyła dania do swojego
komponentu a podklasy mog rozszerza to
działanie. Je li klient wie jaki dekorator
został wykorzystany, to mo e skorzysta z
tych rozszerze .
Stosowalno :
• dynamiczne i prze roczyste dodawanie
zobowi zania do pojedynczych obiektów
• dodanie zobowi za , które mog zosta cofni te
• niepraktyczne rozszerzanie przez podklasy –
mnóstwo niezale nych rozszerze mo e
spowodowa eksplozj hierarchii.
Struktura:
Komponent
+komponent
Operacja()
KomponentK onkretny
Dek orator
Operacja()
Operacja()
DekoratorKonkretnyA
dodanyStan
Operacja()
k omponent->Operacja();
DekoratorKonkretnyB
Operacja()
DodaneZachowanie()
Dekorator::Operacja();
DodaneZachowanie();
Uczestnicy:
• Komponent (KomponentWizualny)
– definiuje interfejs obiektów, do których
mo na dynamicznie doł cza
zobowi zania
• KomponentKonkretny (WidokTekstowy)
– definiuje obiekt, do którego mo na
doł cza dodatkowe zobowi zania
• Dekorator
– zarz dza odwołaniem do obiektu Komponent i
definiuje interfejs dopasowany do interfejsu
Komponentu
• DekoratorKonkretny (.,.)
– dodaje zobowi zania do Komponentu
Współpraca:
• Dekorator przesyła dania do swojego obiektu
Komponent. Mo e opcjonalnie wykonywa inne
operacje przed lub po przesłaniu dania
Konsekwencje:
• wi ksza elastyczno ni przy stosowaniu
statycznego dziedziczenia – runtime,
mieszanie zobowi za , wielokrotne
doł czanie wła ciwo ci (podwójna ramka)
• unikanie przeładowanych wła ciwo ciami
klas na szczycie hierarchii – koncepcja
prostej klasy na szczycie wzbogacanej w
miar potrzeb przez dekoratory
• Dekorator i jego komponent nie s
identyczne
• wiele małych obiektów – takie systemy
składaj si z wielu małych poł czonych ze
sob w skomplikowany sposób obiektów –
ich autorzy mog je bardzo łatwo zmienia ,
ale trudno je zrozumie i trudno usuwa z
nich bł dy
Implementacja:
• zgodno interfejsów obiektu dekorujacego i
dekorowanego
• pomijanie klasy abstrakcyjnej Dekorator – gdy
dodajemy tylko jedno zobowi zanie (po co
ujednolica interfejsy)
• utrzymanie lekko ci klasy Komponent – nie
powinna definiowa danych
• zmiana skóry obiektu (Decorator) a zmiana
wn trza obiektu (Strategy)
Przykłady:
Znane zastosowania:
• GUI
• strumienie IO [rys.]
Pokrewne wzorce:
Adapter – zmienia interfejs a nie tylko
zobowi zania.
Pokrewne wzorce:
• Adapter – zmienia interfejs a nie tylko
zobowi zania.
• Kompozyt. Decorator to zdegenerowany
Kompozyt z jednym komponentem.
• Strategia – zmienia wn trze obiektu, a Dekorator
zewn trze – konkurencyjny sposób zmieniania
obiektu (Strategia - gdy klasa Komponent jest
ci ka)
Structural Design Pattern: Composite
Składa obiekty w struktury drzewiaste
reprezentuj ce hierarchie typu cz -cało .
Umo liwia klientom jednakowe traktowanie
pojedynczych obiektów i zło e obiektów.
Uzasadnienie stosowania:
Aplikacje graficzne umo liwij budowanie
zło onych diagramów z mniejszych
elementów. U ytkownik mo e grupowa
mniejsze elementy w wi ksze, a te w
jeszcze wi ksze.
Problemem jest fakt, e kod w odró nieniu od
u ytkownika musi inaczej traktowa
elementy pierwotne i kontenery.
Wzorzec pokazuje jak zastosowa składanie
rekurencyjne tak aby klienci nie musieli
rozró nia elementów pierwotnych od
kontenerów.
Obiek tGraficzny
Klient
Linia
Rysuj()
Rysuj()
Dodaj( : Obiek tGraficzny)
Usun( : Obiek tGraficzny)
PodajDzieck o( : int)
Prost okat
Tekst
Rysuj()
Ry suj()
+obiekty graficzne
Rysunek
Operacja()
Dodaj( : ObiektGraficzny)
Usun( : ObiektGraficzny)
PodajDziecko( : int)
Kluczowa jest tu klasa abstrakcyjna, która
reprezentuje zarówno zarówno elementy
pierwotne jak i ich konetenery. W
przykładzie jest to klasa ObiektGraficzny.
Deklaruje ona operacje Rysuj() specyficzne
dla obiektów graficznych. Deklaruje te
operacje wspólne dla kontenerów
pozwalaj ce na manipulowanie dzie mi.
Stosowalno :
• potrzebna reprezentacja hierarchii cz cało
• wymaganie aby klienci mogli ignorowa
ró nic mi dzy zło eniami obiektów a
pojedynczymi obiektami
Komponent
Klient
Operacja()
Dodaj( : Komponent)
Usun( : Komponent)
PodajDzieck o( : int)
+dzieci
Kompozyt
Lisc
Operacja()
Operacja()
Dodaj()
Usun()
PodajDziecko()
dla ka dego og z dzieci
og.Operacja();
Uczestnicy:
• Komponent (ObiektGraficzny)
– deklaruje interfejs składanych obiektów
– implementuje, tam gdzie to mo liwe, domy lne
zachowanie w wypadku interfejsu wspólnego dla
wszystkich klas
– definiuje interfejs umo liwiaj cy dost p i zarz dzanie
komponentami- dzie mi
– czasami definiuje interfejs umo liwiaj cy dost p do
rodzica komponentu w strukturze rekurencyjnej i
implementuje go, je li jest taka potrzeba
• Lisc (Prostok t, Linia, Tekst)
– reprezentuje obiekty b d ce li mi w składanej
strukturze
– definiuje zachowanie obiektów pierwotnych w
strukturze
• Kompozyt (Rysunek)
– definiuje zachowanie komponentów maj cych dzieci
– przechowuje komponenty b d ce dzie mi
– implementuje operacje z interfejsu Komponentu
zwi zane z dzie mi
• Klient
– manipuluje obiektami wyst puj cymi w
strukturze, wykorzystuj c do tego interfejs
Komponentu
Współpraca:
• Klienci u ywaj interfejsu z klasy Komponent w
celu komunikowania si z obiektami składanej
struktury. Je li odbiorca jest li ciem, to realizuje
operacj , je li kompozytem, to przesyła dalej.
Konsekwencje:
• definiuje hierarchie klas grupuj ce obiekty
pierwotne i zło one
• upraszcza budow klienta
• ułatwia dodawanie nowych rodzajów
komponentów
• mo e sprawi , e projekt b dzie zbyt ogólny –
trudno ci z ograniczeniem rodzajów obiketów
pierwotnych (dynamiczna kontrola typów zamiast
statycznej)
Implementacja:
• jawne odwołania do rodziców – ułatwiaj
poruszanie si po strukturze i usuwanie
komponentu; pomagaj w realizacji
ChainOfResponsibility
• współdzielenie komponentów
• maksymalne powi kszenie interfejsu Komponentu
• deklarowanie operacji zarz dzania dzie mi
• uporz dkowanie dzieci – je li kolejno ma
znaczenie, to Iterator
• przechowywanie w pami ci podr cznej w
celu zwi kszenia efektywno ci
• kto powinien usuwa komponenty?
• jaka struktura danych jest najlepsza do
przechowywania komponentów
Przykłady:
Znane zastosowania:
Pokrewne wzorce:
• zwi zku komponent-rodzic u ywa si te przy
stosowaniu ChainOfResponsibility
• cz sto u ywany z Decorator
• Flywieght umo liwia współdzielenie
komponentów (ale bez referencji do rodziców)
• Iterator mo e by u ywany do
przechodzenia kompozytów
• Visitor – grupuje w jednym miejscu
operacje i zachowanie, które w przeciwnym
razie byłyby rozproszone w klasach
Kompozyt i Lisc

Podobne dokumenty