Wzorce strukturalne

Transkrypt

Wzorce strukturalne
Wzorce projektowe
dr inż. Marcin Pietroo
Adapter
- strukturalny wzorzec projektowy, którego celem jest
umożliwienie współpracy dwóm klasom o
niekompatybilnych interfejsach
- adapter przekształca interfejs jednej z klas na
interfejs drugiej klasy
- innym zadaniem omawianego wzorca jest
opakowanie istniejącego interfejsu w nowy
Adapter - przykład
Adapter
Wykorzystywane mechanizmy do realizacji
adaptera:
- kompozycja (w zależności od sposobu
realizacji wzorca)
- refleksja (w zależności od sposobu
implementacji)
- bloki instrukcji warunkowych (w adapter i w
klasie będącej głównym interfejsem)
Adapter
Istnieją dwa warianty wzorca Adapter:
• klasowy (wykorzystywany jest mechanizm
wielokrotnego dziedziczenia, adapter
dziedziczy z interfejsu klienta i klasy
adaptowanej)
• obiektowy (jak na przykładzie, jednokrotne
dziedziczenie i kompozycja)
Adapter
Adapter klasowy:
• brak możliwości adaptowania klasy wraz z jej podklasami,
• możliwośd przeładowania metod obiektu adaptowanego.
Adapter obiektowy:
• możliwośd adaptacji klasy wraz z jej podklasami,
• możliwośd dodawania nowej funkcjonalności,
• brak możliwości przeładowania metod obiektu
adaptowanego.
Uwaga: spadek wydajności w zależności od skomplikowania
procesu adaptacji
Decorator
• Wzorzec dekoratora polega na opakowaniu
oryginalnej klasy w nową klasę "dekorującą".
Zwykle przekazuje się oryginalny obiekt jako
parametr konstruktora dekoratora, metody
dekoratora wywołują metody oryginalnego
obiektu i dodatkowo implementują nową funkcję.
• Dekoratory są alternatywą dla dziedziczenia.
Dziedziczenie rozszerza zachowanie klasy w
trakcie kompilacji, w przeciwieostwie do
dekoratorów, które rozszerzają klasy w czasie
działania programu.
Decorator
Decorator
• Zapewnia większą elastycznośd niż statyczne
dziedziczenie.
• Pozwala uniknąd tworzenia przeładowanych
funkcjami klas na wysokich poziomach
hierarchii.
• Powstawanie wielu małych obiektów.
• Zastosowanie np. w pakiecie java.io
Bridge
Strukturalny wzorzec projektowy, który pozwala
oddzielid abstrakcję obiektu od jego implementacji.
• odseparowanie implementacji od interfejsu,
• poprawienie możliwości rozbudowy klas,
zarówno implementacji, jak i interfejsu (m.in.
przez dziedziczenie),
• ukrywanie implementacji od klienta, co
umożliwia zmianę implementacji bez zmian
interfejsu.
Bridge
Facade
Służy do ujednolicenia dostępu do złożonego
systemu poprzez wystawienie uproszczonego,
uporządkowanego interfejsu programistycznego.
Facade
Facade
Wzorzec wyróżnia następujące elementy:
• złożony system – do systemu upraszczamy dostęp
• fasada – klasa posiadająca referencje do elementów
systemu z metodami do wykonywania najczęściej
potrzebnych zadao
• klient – dowolny kod zainteresowany wykorzystaniem
złożonego systemu.
Klient komunikuje się z systemem poprzez fasadę, która w
jego imieniu wykonuje niezbędne operacje na złożonym
systemie. To, czy klient posiada także bezpośredni dostęp do
systemu, zależy od programisty implementującego wzorzec.
Facade
• zmniejszenie liczby zależności między klientem a
złożonym systemem
• wprowadzenie podziału aplikacji na warstwy,
który ułatwia niezależny rozwój klienta i
złożonego systemu,
• możliwośd zablokowania klientowi dostępu od
pewnych obszarów złożonego systemu, jeśli jest
to konieczne,
• kod klienta wykorzystującego fasadę jest
czytelniejszy i łatwiejszy w zrozumieniu
Proxy
Istnieją cztery rodzaje tego wzorca, które jednocześnie definiują
sytuacje, w których może zostad użyty:
• wirtualny – przechowuje obiekty, których utworzenie jest
kosztowne; tworzy je na żądanie
• ochraniający – kontroluje dostęp do obiektu sprawdzając, czy
obiekt wywołujący ma odpowiednie prawa do obiektu
wywoływanego
• zdalny – czasami nazywany ambasadorem; reprezentuje obiekty
znajdujące się w innej przestrzeni adresowej
• sprytne odwołanie – czasami nazywany sprytnym (inteligentnym)
wskaźnikiem; pozwala na wykonanie dodatkowych akcji podczas
dostępu do obiektu, takich jak: zliczanie referencji do obiektu czy
ładowanie obiektu do pamięci
Proxy
Strukturalny wzorzec projektowy, którego celem
jest utworzenie obiektu zastępującego inny
obiekt.
Stosowany jest w celu kontrolowanego
tworzenia na żądanie kosztownych obiektów
oraz kontroli dostępu do nich (np. Hibernate,
oprogramowanie operujące nad dużymi
zbiorami danych, praca z obiektami z ochroną
dostępu itd.).

Podobne dokumenty