Stronę tą wyświetlono już: 9969 razy
Wstęp
Wzorzec projektowy jest pewnym przepisem, rozwiązaniem, które opisuje w jaki sposób można rozwiązać typowe problemy programistyczne w sposób wydajny tzn. taki, że algorytm zaimplementowany w ten sposób będzie działał szybko oraz dawał możliwość łatwej jego modyfikacji w razie potrzeby. Stawia się tutaj również szczególny nacisk na zwiększenie czytelności kodu np. poprzez wydzielenie określonych zadań różnym obiektom klas oraz częstemu wykorzystaniu polimorfizmu.
Podział wzorców projektowych
Najogólniej rzecz biorąc wzorce projektowe można podzielić na wzorce:
- klasowe - dotyczące klas;
- obiektowe - dotyczące obiektów klas
Nieco bardziej szczegółowym podziałem jest podział względem realizowanych przez dany wzorzec działań. Pod tym względem wyróżnia się następujące wzorce projektowe:
- kreacyjne (konstrukcyjne) - celem tego typu wzorców jest tworzenie i inicjalizowanie obiektów klas;
- strukturalne - celem tego typu wzorców jest opis struktury powiązania z sobą obiektów;
- czynnościowe (behawioralne, operacyjne) - celem ich jest opis zachowania i odpowiedzialności współpracujących z sobą obiektów
Wzorce kreacyjne
- budowniczy (wzorzec obiektowy);
- fabryka abstrakcyjna (obiektowy);
- metoda wytwórcza (klasowy);
- prototyp (obiektowy);
- singleton (obiektowy)
Wzorce strukturalne
- adapter (klasowy oraz obiektowy);
- dekorator (obiektowy) - ten wzorzec mocno jest zagnieżdżony w Pythonie i często wykorzystywany;
- fasada (obiektowy);
- kompozyt (obiektowy);
- most (obiektowy);
- pełnomocnik (obiektowy);
- pyłek (obiektowy)
Wzorce czynnościowe
- łańcuch zobowiązań/odpowiedzialności (obiektowy);
- polecenie (obiektowy) (ang. command);
- interpreter (klasowy);
- iterator (obiektowy);
- mediator (obiektowy);
- pamiątka (ang. Memento) (obiektowy);
- metoda szablonowa (ang. template method) (klasowy);
- obserwator (obiektowy);
- stan (obiektowy);
- strategia (obiektowy);
- odwiedzający/wizytator (ang. visitor) (obiektowy)
Diagramy UML
W celu zaprezentowania sposobu realizacji danego wzorca oraz zależności pomiędzy poszczególnymi obiektami w danym wzorcu stosuje się często diagramy UML (zunifikowanego języka modelowania). Korzystanie z tego typu diagramów wymaga znajomości podstawowych oznaczeń na nim wykorzystywanych.
Diagramy diagramy UML opisują następujące związki (powiązania) pomiędzy obiektami klas:
zależność - jest to najsłabszy typ zależności, w którym jedna z klas wykorzystuje drugą do realizacji części swoich zadań. Na diagramie zależność tego typu oznacza się za pomocą linii przerywanej zakończonej strzałką wskazującą kierunek zależności. Dla przykładu niech istnieje sobie klasa Interpolation, której celem jest wyznaczenie współczynników wielomianu interpolującego zawarte w tej klasie punkty. W tym celu klasa ta ma metodę publiczną calc, która wewnątrz tworzy obiekt klasy Matrix. Klasa ta jest odpowiedzialna za obliczenie współczynników szukanego wielomianu a następnie jest niszczona. Diagram UML w ogólności będzie więc wyglądał jak na poniższym rysunku
agregacja jest to relacja typu całość-część, gdzie elementy składowe mogą należeć do większej całości ale mogą też występować oddzielnie. Agregacja na diagramie zaznaczana jest linią zakończoną pustym rombem. Typowym przykładem agregacji są pola klasy, które zawierają obiekty innych klas. Jest więc to zawieranie się jednego typu obiektu w drugim. Weźmy naszą klasę Interpolation, która zawiera obiekt typu vector
przyjmujący jako argumenty obiekty klasy dPoint2D. Tak więc klasa Interpolation agreguje klasę vector a ta agreguje obiekty klasy dPoint2D opisującej współrzędne punktu 2W. generalizacja jest to związek opisujący dziedziczenie przez daną klasę innych klas. Tego typu związek opisuje się na diagramie UML za pomocą niewypełnionej strzałki skierowanej w kierunku klasy dziedziczonej.
kompozycja jest to związek opisujący relację całość-część, gdzie element składowy stanowi integralną część całości. Każda część jest niszczona wraz z obiektem głównym. Na diagramach UML kompozycję oznacza się rombem zamalowanym na czarno.