Wzorce projektowe - wstęp
Wzorzec projektowy (ang. Design pattern)
![](images/wzorce/1.png)
Geneza wzorców:
"Wzorzec opisuje problem, który powtarza się wielokrotnie w danym środowisku, oraz podaje istotę jego rozwiązania w taki sposób, aby można było je zastosować miliony razy bez potrzeby powtarzania tej samej pracy"
Christopher Alexander "A pattern language", 1977
Historia
Wzorce projektowe w informatyce wywodzą się z wzorców projektowych w architekturze, które zostały zaproponowane przez amerykańskiego architekta Christophera Alexandra i miały ułatwić konstruowanie mieszkań i pomieszczeń biurowych. Pomysł ten nie został jednak przyjęty.
Inaczej stało się w informatyce. Termin wzorca projektowego został wprowadzony do inżynierii oprogramowania przez Kenta Becka oraz Warda Cunninghama w 1987 roku, kiedy, na konferencji OOPSLA, przedstawili wyniki swojego eksperymentu dotyczącego ich zastosowania w programowaniu. Został spopularyzowany w 1995 przez Bandę Czworga (Erich Gamma. Richard Helm, Ralph johnson oraz John Vlissides) dzięki książce Inżynieria oprogramowania: Wzorce projektowe.
Motywacja
Czy odpowiedzi na powtarzające się pytania można przedstawić w sposób ogólny, tak aby były pomocne w tworzeniu rozwiązań w różnych konkretnych kontekstach?
Czy jakość projektu można opisać w kategoriach powtarzalnych rozwiązań, bez konieczności ciągłego "wynajdywania koła"?
Dążenie do jednolitości rozwiązań, ich klasyfikacji i uproszczenia, pojawiają w wielu dziedzinach inżynierii. Podstawowe pytanie, jakie stawiają sobie inżynierowie, dotyczy możliwości wielokrotnego wykorzystania raz sformułowanego rozwiązania danego problemu. Czy można zapisać to rozwiązanie w sposób ogólny, abstrahując od szczegółowych rozwiązań? Pozwoliłoby ująć tzw. dobre praktyki w postaci szablonów, które można stosować wielokrotnie, unikając typowych błędów.
Definicja
"Wzorzec to sprawdzona koncepcja, która opisuje problem powtarzający się wielokrotnie w określonym kontekście, działające na niego siły, oraz podaje istotę jego rozwiązania w sposób abstrakcyjny"
Christopher Alexander
Wzorce projektowe, choć obecnie znane przede wszystkim w kontekście inżynierii oprogramowania, wywodzą się z architektury. Twórcą tego pojęcia był amerykański architekt, Christopher Alexander, który postawił tezę, że piękno, funkcjonalność oraz inne cechy użytkowe lub konstrukcyjne można zapisać właśnie w postaci uogólnionych rozwiązań. Wzorce opisane przez Alexandra powstały na podstawie analizy decyzji podejmowanych przez architektów i budowniczych, którzy usiłowali osiągnąć określony efekt, z ich doświadczeń, błędów i odkryć.
Wprawdzie idee Alexandra nie odbiły się szerokim echem w świecie architektury, jednak stanowiły silny impuls dla rozwoju technik projektowania oprogramowania.
Banda Czterech (Gang of Four)
Wzorzec projektowy identyfikuje i opisuje pewną abstrakcję, której poziom znajduje się powyżej poziomu abstrakcji pojedynczej klasy, instancji lub komponentu.
E. Gamma, R. Helm, R. Johnson, J. Vlissides (1994)
![](images/wzorce/2.png)
Autorami pierwszej szeroko znanej publikacji poświęconej wzorcom w inżynierii oprogramowania byli E. Gamma, R. Helm, R.Johnson i J. Vlissides, znani jako Banda Czterech (Gang of Four) ? w bliżej niesprecyzowanym nawiązaniu do nazwy grupy dawnych prominentów w komunistycznych Chinach. W swojej książce opisali 24 wzorce projektowe dotyczące konstrukcji, struktury i zachowania obiektów w systemach informatycznych. Ich zdaniem, poziom abstrakcji wzorca projektowego powinien znajdować się powyżej poziomu pojedynczej klasy. Od tego czasu wzorce projektowe stały się jednym z podstawowych narzędzi projektowania systemów. Powstały nowe, specjalizowane wzorce poświęcone rozwiązaniom dla konkretnych technologii czy platform (np. wzorce dla J2EE).
Podział wzorców projektowych
![](images/wzorce/design.jpg)
Kreacyjne (konstrukcyjne, creational design patterns)
- opisują elastyczne sposoby tworzenia obiektów
- uniezależniają system od sposobu tworzenia obekt
- Metoda Wytwórcza (Factory Method), Budowniczy (Builder), Fabryka Abstrakcyjna (Abstract Factory), Prototyp (Prototype), Singleton
Strukturalne (structural design patterns)
- opisują sposob konstrukcji struktur obiektowych
- korzystają z dziedziczenia i delegacji
- Adapter (klasy), Adapter (obiekty), Dekorator (Decorator), Fasada (Facade), Kompozyt (Composite), Most (Bridge), Pełnomocnik (Proxy), Pyłek (Flyweight)
Behawioralne (czynnościowe, behavioral design patterns)
- opisują algorytmy i przydział odpowiedzialności
- charakteryzują sposob interakcji między obiektami
- Interpreter, Metoda Szablonowa (Template Method), Iterator, Łańcuch Zobowiązań (Chain of Responsibility), Mediator, Obserwator (Observer), Odwiedziający (Visitor), Pamiątka (Memento), Polecenie (Command), Stan (State), Strategia (Strategy)
![](images/wzorce/3.png)
Szablon wzorca projektowego:
Wzorzec projektowy jest opisany przez:
- nazwę - lakoniczny opis istoty wzorca
- klasyfikację - kategorię, do której wzorzec należy
- cel - do czego wzorzec służy
- aliasy - inne nazwy, pod którymi jest znany
- motywację - scenariusz opisujący problem i rozwiązanie
- zastosowania - sytuacje, w których wzorzec jest stosowany
- strukturę - graficzną reprezentację klas składowych wzorca
- uczestników - nazwy i odpowiedzialności klas składowych wzorca
- współdziałania - opis współpracy między uczestnikami
- konsekwencje - efekty zastosowania wzorca
- implementację - opis implementacji wzorca w danym języku
- przykład - kod stosujący wzorzec
- pokrewne wzorce - wzorce używane w podobnym kontekście
Bardzo ważnym elementem jest opis struktury wzorca, przede wszystkim w zakresie powiązań pomiędzy uczestniczącymi w nim klasami w postaci diagramu klas UML. Aspekt dynamiczny opisywany jest w atrybucie dotyczącym kolaboracji.
Wykorzystanie wzorców projektowych
API języka Java - obsługa sieci, graficzny interfejs użytkownika, obsługa in-out. Biblioteki procedur i szkielety aplikacji przeszły długą drogę zanim wyewoluowały do obecnego modelu.
Mimo całej doskonałości API nie pomoże stworzyć aplikacji, która będzie przejrzysta, łatwa w serwisowani i elastyczna.
To właśnie tutaj przydadzą się wzorce projektowe.