Wzorce strukturalne: Fasada, Kompozyt, Most, Pyłek Flashcards
Kompozyt - nazwa
ang. composite
Kompozyt - typ
obiektowy, strukturalny
Kompozyt - Przeznaczenie
Strukturalny wzorzec projektowy, którego celem jest organizacja obiektów w strukturę (hierarchiczną, drzewiastą grupę obiektów) i zdefiniowanie interfejsu wspólnego zarówno dla pojedynczych obiektów jak i grup obiektów.
W ten sposób klient ma możliwość korzystania ze złożonych struktur obiektów w taki sam sposób jak z obiektów pierwotnych (pojedynczych). Ponadto w łatwy sposób można rozszerzać funkcjonalność programu, dodając nowe struktury (komponenty).
Kompozyt - Uzasadnienie
Aplikacje graficzne umożliwiają użytkownikom budowanie złożonych diagramów z prostych komponentów (punkt, linia, tekst). Użytkownik może je łączyć w jeszcze bardziej rozbudowane komponenty. Mimo, że użytkownicy korzystają z obiektów prostych i kontenerowych tak samo, to w kodzie trzeba je traktować w odmienny sposób. Kluczowym elementem wzorca kompozyt jest klasa abstrakcyjna reprezentująca zarówno typy proste i zawierające kontenery
Kompozyt - Warunki stosowania
- przedstawienie hierarchii część-całość
* żeby po stronie klienta można było ignorować różnice między obiektami prostymi i złożonymi
Kompozyt - Elementy
• Komponent (Component):
- klasa abstrakcyjna reprezentująca pojedyncze obiekty (deklaracja interfejsu),
- implementuje domyślne zachowanie na potrzeby interfejsu wspólnego klas,
- obejmuje deklarację interfejsu umożliwiającego dostęp do komponentów podrzędnych i zarządzanie nimi,
- definiuje interfejs umożliwiający dostęp do elementu nadrzędnego dengo komponentu w strukturze rekurencyjnej;
• Kompozyt (Composite):
- przechowuje obiekty podrzędne (Liść),
- implementuje zachowanie elementów które zawiera,
- obejmuje implementację operacji z interfejsu klasy Komponent związanej z elementami podrzędnymi;
• Liść (Leaf):
- typ prosty, nie posiada potomków
Kompozyt - Konsekwencje
- umożliwia definiowanie hierarchii składających się z obiektów prostych i złożonych
- upraszcza kod klientów
- ułatwia dodawanie komponentów nowego rodzaju
- może sprawić, że projekt stanie się zbyt ogólny (ograniczenie dodawania różnych typów prostych)
Kompozyt - Implementacja
- jawne referencje do elementu nadrzędnego (ułatwia poruszanie się po strukturze złożonej) - standardowo zdefiniowane w klasie Komponent
- +- współużytkowanie komponentów - jeśli komponent nie może mieć więcej niż jednego elementu nadrzędnego, stosowanie staje się trudne
- maksymalizowanie interfejsu klasy Komponent (zdefiniowanie jak najwięcej wspólnych cech klas Kompozyt i Liść)
Kompozyt – Powiązane wzorce
- dekorator - jeśli użyte są razem, zwykle mają wspólną klasę nadrzędną
- pyłek - umożliwia współużytkowanie komponentów, które jednak nie przechowują referencji do elementów nadrzędnych
- iterator - do przechodzenia po zawartości kompozytów
- odwiedzający - zapewnia jedną lokalizację dla operacji i zachowań
Most - nazwa
ang. bridge
pol. uchwyt/ciało
ang. handle/body
Most - typ
obiektowy, strukturalny
Most - Przeznaczenie
Oddziela klasę abstrakcji od jej implementacji, dzięki czemu można edytować te elementy niezależnie.
Most - Uzasadnienie
Jeśli abstrakcja może mieć jedną z kilku implementacji, zwykle stosowane jest dziedziczenie. W klasie abstrakcyjnej znajduje się definicja interfejsu abstrakcji, a w konkretnych podklasach — różne implementacje. Jednak to podejście nie zawsze jest wystarczająco elastyczne. Dziedziczenie trwale wiąże implementację z abstrakcją, co utrudnia modyfikowanie, rozszerzanie i wielokrotne korzystanie z tych elementów niezależnie od siebie.
Most - Warunki stosowania
- W celu uniknięcia trwałego powiązania abstrakcji i jej implementacji. Może to być przydatne na przykład wtedy, kiedy implementację trzeba wybrać lub zmienić w czasie wykonywania programu.
- Kiedy rozszerzanie przez tworzenie podklas powinno być możliwe zarówno dla abstrakcji, jak i dla implementacji. Wtedy wzorzec Most umożliwia łączenie różnych abstrakcji i implementacji oraz rozszerzanie ich niezależnie od siebie.
- Jeżeli zmiany w implementacji abstrakcji nie powinny mieć wpływu na klienty (ich kod nie powinien wymagać ponownej kompilacji).
Most - Elementy i współdziałanie
• Abstrakcja (Abstraction):
- definiuje interfejs abstrakcji;
- przechowuje referencję do obiektu typu Implementator.
• WzbogaconaAbstrakcja (RefinedAbstraction):
- rozszerza interfejs zdefiniowany w klasie Abstrakcja.
• Implementator (Implementor):
- definiuje interfejs dla klas z implementacją. Interfejs ten nie musi dokładnie odpowiadać interfejsowi klasy Abstrakcja (różnice między nimi mogą być dość znaczne). Zwykle interfejs klasy Implementator udostępnia jedynie proste operacje, a w klasie Abstrakcja zdefiniowane są oparte na nich operacje wyższego poziomu.
• KonkretnyImplementator (Concretelmplementor):
- obejmuje implementację interfejsu klasy Implementator i definiuje jej implementację konkretną.
Klasa Abstraction przekazuje żądania klienta do powiązanego z nią obiektu Implementator.