Wzorce projektowe - wstęp

Wzorzec projektowy (ang. Design pattern)



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)

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


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)

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.