Wzorce strukturalne: Adapter, Dekorator, Pełnomocnik Flashcards
Wzorce strukturalne
- adapter
- dekorator
- fasada
- kompozyt
- most
- pełnomocnik
- pyłek
Adapter - nazwy
ang. adapter
pol. nakładka
ang. wrapper
Adapter - kategoria
- obiektowy/klasowy
- strukturalny
Adapter - Przeznaczenie
Przekształca interfejs klasy na inny oczekiwany przez klienta.
Adapter - Uzasadnienie
Czasem nie można wykorzystać zaprojektowanej klasy, ponieważ ma niezgodny interfejs. Często spotykane w bibliotekach zewnętrznych kiedy nie znamy zasady ich działania.
Możemy wtedy napisać klasę która będzie dopasowywała niezgodność do naszych oczekiwań (rozwiązanie klasowe) lub stworzyć obiekt który będzie dysponować odpowiednim interfejsem (rozwiązanie obiektowe).
Adapter - Warunki stosowania
- Jeśli jest potrzeba wykorzystania klasy ale jej interfejs nie pasuje do tego który jest potrzebny;
- kiedy chcesz utworzyć klasę wielokrotnego użytku współdziałającą z niepowiązanymi lub nieznanymi klasami;
- jeżeli trzeba użyć kilku istniejących podklas, ale dostosowywanie ich interfejsów przez utworzenie dla każdej z nich następnej podklasy jest niepraktyczne;
Adapter – Elementy i współdziałanie
• ElementDocelowy (Target):
- definiuje specyficzny dla dziedziny interfejs używany przez Klienta.
• Klient (Client):
- współdziała z obiektami zgodnymi z interfejsem klasy ElementDocelowy.
• ElementAdaptowany (Adaptee):
- definiuje istniejący interfejs, który trzeba dostosować.
• Adapter (Adapter):
- dostosowuje interfejs klasy ElementAdaptowany do interfejsu klasy ElementDocelowy.
Klienty wywołują operacje egzemplarzy klasy Adapter. Z kolei adapter wywołuje operacje klasy ElementAdaptowany, które obsługują żądanie.
Adapter – Konsekwencje (klasowy)
- Dostosowuje klasę ElementAdaptowany do klasy ElementDocelowy przez dopasowanie się do klasy konkretnej ElementAdaptowany; powoduje to, że adapter klasowy nie zadziała, jeśli zechcemy dostosować klasę oraz wszystkie jej podklasy;
- umożliwia przesłonięcie w klasie Adapter wybranych działań klasy ElementAdaptowany (dzieje się tak, ponieważ Adapter to podklasa klasy ElementAdaptowany);
- powoduje dodanie tylko jednego obiektu, a uzyskanie dostępu do dostosowywanej klasy nie wymaga dodatkowego poziomu pośredniego w postaci wskaźnika.
Adapter – Konsekwencje (obiektowy)
- Umożliwia współdziałanie jednej klasy Adapter z wieloma klasami ElementAdaptowany (czyli z samą klasą ElementAdaptowany i z wszystkimi jej podklasami, jeśli takie istnieją); w klasie Adapter można też dodać funkcje do wszystkich klas ElementAdaptowany jednocześnie;
- utrudnia przesłanianie zachowań z klasy ElementAdaptowany; wymaga to utworzenia podklasy klasy ElementAdaptowany i wskazywania w klasie Adapter tej podklasy zamiast samej klasy ElementAdaptowany.
Adapter – Powiązane wzorce
- most - ma podobną strukturę, ale inne funkcje - ma rozdzielić interfejs od implementacji
- dekorator - pozwala wzbogacać inne obiekty bez zmiany ich interfejsu, więc jest bardziej przeźroczysty, umożliwia składanie rekurencyjne, czego adapter nie umożliwia
Dekorator - Nazwa
ang. decorator
pol. nakładka
ang. wrapper
Dekorator - Kategoria
- obiektowy,
- strukturalny
Dekorator - Przeznaczenie
Dynamiczne dodawanie funkcjonalności do obiektów.
Jest to alternatywa do dziedziczenia które rozszerza zachowanie w trakcie kompilacji, w przeciwieństwie do dekoratora który rozszerza klasy w czasie wykonywania programu.
Dekorator - Uzasadnienie
• Najczęstszym przykładem jest okno które będzie w jakiś sposób ozdabiane. Można dodać do niego pasek przewijania bądź ramkę. Można to uczynić poprzez dziedziczenie po klasie dodającej obramowanie, jednak wtedy wszystkie obiekty będą tę ramkę posiadać przez to rozwiązanie jest nieelastyczne.
Dekorator pozwala umieszczać obiekt w innym obiekcie który doda wspomnianą ramkę lub pasek przewijania (również oba naraz).
• Interfejs dekoratora musi być zgodny z interfejsem ozdabianego obiektu, dzięki temu jest przeźroczysty i umożliwia rekurencyjne zagnieżdżanie dekoratorów.
Dekorator - Warunki stosowania
- kiedy zadania poszczególnych obiektów mają być dodawane w sposób dynamiczny i przeźroczysty
- jeśli tworzenie wielu podklas jest niepraktyczne
Dekorator – Elementy i współdziałanie
• Komponent (Component):
- definiuje interfejs obiektów do których można dynamicznie dodawać obsługę zadań
• KonkretnyKomponent (ConcreteComponet):
- definiuje obiekt do którego można dołączyć obsługę zadań
• Dekorator (Decorator):
- przechowuje referencję do obiektu Komponent i definiuje interfejs zgodny z interfejsem klasy
Komponent
• KonkretnyDekorator (ConcreteDecorator):
- dodaje zadania do komponentu
Obiekt Dekorator przekazuje żądania do powiązanego z nim obiektu Komponent. Opcjonalnie może też wykonywać dodatkowe operacje przed przesłaniem żądania lub po.
Dekorator - Konsekwencje
- zapewnia większą elastyczność niż statyczne dziedziczenie
- pozwala uniknąć tworzenia przeładowanych funkcjami klas na wysokich poziomach hierarchii.
- dekorator i powiązany z nim komponent nie są identyczne
- powstawanie wielu małych obiektów
Dekorator - Implementacja
- zgodność z interfejsem (dziedziczenie po wspólnej klasie Komponent)
- pomijanie klasy abstrakcyjnej Dekorator (jeśli jest potrzebny tylko jeden KonkretnyDekorator)
- tworzenie prostych klas Komponent (dziedziczą po tym dekoratory, nie chcemy żeby były zbyt ciężkie)
- zmiana “skórki”, a modyfikowanie mechanizmów (patrz: strategia - wzorce operacyjne)
Dekorator – Powiązane wzorce
- adapter - dekorator modyfikuje jedynie zadania obiektu, a nie jego interfejs
- kompozyt - dekorator dodaje nowe zadania i nie jest przeznaczony do łączenia obiektów (można traktować jako uproszczony komponent)
- strategia - dekorator umożliwia zmianę “skórki” obiektu, do modyfikowania mechanizmów służy strategia
Pełnomocnik
ang. proxy
pol. substytut
ang. surrogate
Pełnomocnik - kategoria
obiektowy,
strukturalny
Pełnomocnik - Przeznaczenie
Udostępnia obiekt zastępujący inny obiekt w celu kontrolowania dostępu.
Pełnomocnik - Uzasadnienie
- Odroczenie ponoszenia pełnych kosztów tworzenia i inicjowania obiektu do momentu kiedy będzie potrzebny.
- Edytor w którym obiekty obrazów tworzone są tylko w momencie wyświetlania. Niewidoczne obrazy są tylko zastępczymi.
Pełnomocnik - Warunki stosowania
- kiedy jest potrzeba tworzenia kosztownych obiektów na żądanie;
- kontrola dostępu do obiektu;
- inteligentne zliczanie referencji prowadzących do pierwotnego obiektu (jak spada do 0, można zwolnić pamięć).
Pełnomocnik - Elementy i współdziałanie
• Pełnomocnik (Proxy):
- przechowuje referencję umożliwiającą dostęp do RzeczywistegoObiektu
- udostępnia interfejs identyczny z interfejsem do klasy Obiekt
- kontroluje dostęp do RzeczywistegoObiektu
• Obiekt (Subject):
- definiuje wspólny interfejs klas Pełnomocnik i RzeczywistyObiekt, dzięki temu obiektów Proxy można używać wszędzie tam gdzie oczekiwane są obiekty RzeczywistyObiekt
• RzeczywistyObiekt (RealSubject):
- definiuje rzeczywisty obiekt reprezentowany przez Pełnomocnika
Pełnomocnik - Konsekwencje
- pośrednik może ukrywać, że obiekt znajduje się w innej przestrzeni adresowej;
- może umożliwiać tworzenie obiektów na żądanie;
- zabezpieczenie dostępu;
- inteligentne referencje umożliwiają wykonywanie dodatkowych operacji.
Pełnomocnik - Implementacja
• Pełnomocnik nie zawsze musi znać typ rzeczywistego obiektu
Pełnomocnik – Powiązane wzorce
- adapter - adapter służy do tworzenia nowego interfejsu, pełnomocnik ma ten sam;
- dekorator - inne przeznaczenie, dekorator dodaje zadania do obiektu, pełnomocnik kontroluje dostęp