WZORCE
Diagramy przypadków użycia
Tworzenie przypadków użycia to technika stosowana w celu opisania wymagań tworzonego systemu informatycznego. Przypadek użycia przedstawia interakcję pomiędzy aktorem (użytkownikiem systemu), który inicjuje zdarzenie oraz samym systemem, jako sekwencję prostych kroków.
Opis ogólny, przypadek użycia powinien:
opisywać, w jaki sposób system powinien być używany przez aktora w celu osiągnięcia konkretnego celu
być pozbawiony szczegółów dotyczących implementacji oraz interfejsu użytkownika
opisywać system na właściwym poziomie szczegółowości
Wzorce konstrukcyjne
Definicja: Wzorce te opisują proces tworzenia nowych obiektów, ich zadaniem jest tworzenie inicjalizacja oraz konfiguracja obiektów, klas oraz innych typów danych.
Budowniczy (builder) – oddziela specyfikację(definicję) jakiegoś złożonego obiektu od procesu jego konstruowania. We wzorcu tym nacisk jest położony na konstruowanie złożonych obiektów krok po kroku(etapami). Części muszą być tworzone w jakiejś kolejności lub przy użyciu określonego algorytmu.
Przykład: Tworzenie obiektu domu. Jest to obiekt złożony z wielu części i jego budowa wymaga pewnych etapów. Każdy element może być wykonany inaczej, np. z nieco innych materiałów, według innego algorytmu (o tym decyduje budowniczy)
Fabryka abstrakcyjna (abstract factory) – Celem tego wzorca jest dostarczenie interfejsu do tworzenia różnych obiektów jednego typu (tej samej rodziny) bez specyfikowania ich konkretnych klas. Umożliwia jednemu obiektowi tworzenie różnych, powiązanych ze sobą, reprezentacji podobiektów określając ich typy podczas działania programu.
Fabryka abstrakcyjna różni się od budowniczego, tym, że kładzie nacisk na tworzenie produktów z konkretnej rodziny, a budowniczy kładzie nacisk na sposób tworzenia obiektów.
Metoda wytwórcza (factory method) – ma za zadanie tworzenie nowych obiektów. Obiekty te są nieokreślonego typu, ale są one powiązane na podstawie klas, z których dziedziczą lub interfejsów, które implementują. Wzorzec ten tworzy się przez zdefiniowanie interfejsu do tworzenia obiektów, ale dopiero klasy implementujące ten interfejs decydują, jaki obiekt, jakiej klasy ma być stworzony.
Prototyp (prototype) - jego głównym zadaniem jest specyfikacja tworzonego obiektu przy pomocy prototypu. Specyfikacja tego obiektu określa możliwość tworzenia obiektu za pomocą jego prototypu.
- Pozwala na dodawanie i usuwanie obiektów w czasie działania programu
- Przyspiesza kreowanie dużych obiektów
Singleton - jego celem jest ograniczenie możliwości tworzenia obiektów danej klasy do jednej instancji oraz zapewnienia globalnego dostępu do tworzonego obiektu.
- kontrolowany dostęp do jednej instancji
- zredukowana przestrzeń nazw
- pozwala na zwiększenie dozwolonej ilości instancji
Wzorce strukturalne
Definicja: Wzorce te opisują struktury powiązanych ze sobą obiektów.
Adapter – jego celem jest umożliwienie współpracy dwóm klasom o niekompatybilnych interfejsach. Adapter przekształca interfejs jednej klasy w interfejs drugiej klasy.
Zastosowanie
- gdy klasa nie może być użyta, ponieważ ma niekompatybilny interfejs
- gdy nie mamy kodu źródłowego klas nie możemy zmienić ich interfejsu.
Dekorator (Decorator) - jego zadaniem jest rozszerzenie funkcjonalności obiektu poprzez dynamiczne dołączenie dodatkowych zachowań do danego obiektu:
- wzorzec ten pozwala na „dekorowanie” zachowania klasy, czyli zmianę jej funkcjonalności bez potrzeby dziedziczenia
- jego działanie można upodobnić do dziedziczenia z tą różnicą, że dziedziczenie rozszerza zachowanie klasy w trakcie kompilacji a dekoratory rozszerzają klasy w czasie działania programu
Fasada (Facade) – zadaniem fasady jest dostarczenie uproszczonego interfejsu do obsługi dużo bardziej złożonego systemu, klasy itp.
Zalety:
- dostarcza prostszy interfejs do rozbudowanego systemu bez ograniczania jego funkcjonalności
- osłania klienta od złożoności komponentów podsystemu
- dostarcza „łącznik” pomiędzy podsystemem a jego klientami
Kompozyt (Composite) – jego celem jest składanie obiektów w taki sposób, aby klient widział wiele z nich jako pojedynczy obiekt. Pozwala klientowi na operowanie w sposób ogólny na obiektach, które mogą reprezentować hierarchię obiektów.
Zalety:
- klient jednolicie wykonuje operacje na obiekcie złożonym i „prymitywnym”
- łatwo dodawać nowe rodzaje komponentów
Współpraca:
Klienci używają interfejsu z klasy Komponent w celu komunikowania się z obiektami występującymi w składanej strukturze. Jeśli odbiorca jest Liściem, to żądania są realizowane bezpośrednio. Jeśli natomiast odbiorca jest Kompozytem, to zwykle przekazuje żądania swoim komponentom-dzieciom, być może wykonując przed i/lub po przekazaniu dodatkowe operacje.
Most (Bridge) – jest podobny do adaptera. Wzorzec ten powstałby oddzielić interfejs od implementacji tak by oba elementy mogły istnieć niezależnie, a co za tym idzie by powstała możliwość wprowadzenia zmian do implementacji bez konieczności zmian w kodzie, który korzysta z klasy.
Zalety:
- umożliwia odseparowanie implementacji od interfejsu
- poprawia możliwość rozbudowy klas
- ukrywanie szczegółów implementacyjnych od klienta
Pełnomocnik (proxy) - Pełnomocnik ma zastosowanie zawsze wtedy, kiedy potrzeba bardziej uniwersalnego lub bardziej wyrafinowanego odwołania do obiektu niż zwykły wskaźnik.
Istnieją cztery rodzaje tego wzorca, które jednocześnie definiują sytuacje, w których może zostać 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 wskaźnikiem; pozwala na wykonanie dodatkowych akcji podczas dostępu do obiektu, takich jak: zliczanie referencji do obiektu czy ładowanie obiektu do pamięci
Pyłek (Flyweight) - jego celem jest zmniejszenie wykorzystywania pamięci poprzez efektywną obsługę wielu małych obiektów za pomocą współdzielenia. Ideą wzorca jest podział danych przechowywanych w obiektach na dane wewnętrzne (współdzielone) i zewnętrzne (unikatowe dla każdego obiektu). Dane wewnętrzne nie są modyfikowane przy instancji obiektu, natomiast dane zewnętrzne są dostarczane dla każdego obiektu z zewnątrz przed przekazaniem obiektu klientowi.
Zalety:
- Niektórych programów nie da się napisać w sposób obiektowy bez stosowania wagi piórkowej.
- zmniejszenie wymagań pamięciowych programu
Wzorce czynnościowe
Definicja: Wzorce te opisują zachowanie i odpowiedzialność współpracujących ze sobą obiektów.
Iterator – jego celem jest zapewnienie sekwencyjnego dostępu do podobiektów zgrupowanych w większym obiekcie.
Łańcuch zobowiązań (Chain of responsibility) – jego celem jest obsługa żądania, które może być przetwarzane przez różne obiekty, w zależności od jego typu
Jego celem jest:
- usunięcie powiązania pomiędzy nadawcą i odbiorcą żądania
- umożliwienie wielu obiektom obsługi żądania
- komunikat przechowywany jest pomiędzy obiektami należącymi do pewnego zbioru zgodnie z precyzyjnie wyznaczoną trasą i kolejnością
- odpowiedzialność za przetworzenie komunikatu spada na obiekt, który jest do tego zadania najlepiej przygotowany
Mediator - zapewnia jednolity interfejs do różnych elementów danego podsystemu. Zmniejsza to liczbę powiązań między różnymi klasami, poprzez utworzenie mediatora będącego jedyną klasą, która dokładnie zna metody wszystkich innych klas, którymi zarządza. Nie muszą one nic o sobie wiedzieć, jedynie przekazują polecenia mediatorowi, a ten rozsyła je do odpowiednich obiektów.
Metoda szablonowa (template method) - definiuje szkielet programu dla implementacji algorytmu. Algorytm jest abstrakcyjny i dopiero klasy potomne realizują pełne działanie. Stosowany, gdy opracowanie ogólnej metody algorytmu okazało się niemożliwe.
Niezmienna część algorytmu zostaje opisana w tzw. metodzie szablonowej, której nie wolno przesłaniać. W metodzie tej wywoływane są inne metody, reprezentujące zmienne fragmenty algorytmu. Metody te mogą być abstrakcyjne lub definiować domyślne zachowania. Programista, który chce skorzystać z algorytmu musi utworzyć podklasę klasy z metodą szablonową i przesłonić metody opisujące zmienne fragmenty.
Obserwator – używany jest do powiadamiania zainteresowanych obiektów o zmianie stanu pewnego innego obiektu. Jest stosowany przy projektowaniu środowisk prezentacji danych.
Polecenie (Command) - hermetyzacja poleceń do wykonania w postaci obiektów, umożliwienie parametryzacji klientów obiektami poleceń, wsparcie dla poleceń odwracalnych.
Podstawowym elementem wzorca jest interfejs Command, deklarujący metodę execute(). Jest to polimorficzna metoda reprezentująca polecenie do wykonania. Metoda ta jest implementowana w klasach ConcreteCommand w postaci polecenia wykonania określonej akcji na obiekcie-przedmiocie Receiver. Klient nie jest bezpośrednio związany ani z obiektem Command, ani z obiektem inicjującym jego wywołanie, czyli Invoker. Widzi jedynie odbiorcę wyników operacji obiekt Receiver.
Stan (State) - umożliwia zmianę zachowania obiektu poprzez zmianę jego stanu wewnętrznego. Innymi słowy uzależnia sposób działania obiektu od stanu, w jakim się aktualnie znajduje.
Zalety:
- możliwość łatwego dodawania kolejnych narzędzi
Strategia (Strategy) – jego celem jest ukrycie implementacji grupy powiązanych ze sobą algorytmów oraz ułatwienie zmiany ich implementacji bez ingerencji w kod klienta. Program klienta może wybrać jeden z tych algorytmów. Intencją wzorca jest wymienność algorytmów w trakcie działania programu oraz ich hermetyzacja