Dekorator (wzorzec projektowy)

Zobacz też: inne znaczenia słowa „dekorator”.
Sprzątanie Wikipedii
Ten artykuł należy dopracować:
Patrz: Zalecenia edycyjne dla wzorców projektowych.
Po wyeliminowaniu niedoskonałości należy usunąć szablon {{Dopracować}} z tego artykułu.

Dekorator – wzorzec projektowy należący do grupy wzorców strukturalnych. Pozwala na dodanie nowej funkcji do istniejących klas dynamicznie podczas działania programu.

Wzorzec dekoratora polega na opakowaniu oryginalnej klasy w nową klasę „dekorującą”. Zwykle przekazuje się oryginalny obiekt jako parametr konstruktora dekoratora, metody dekoratora wywołują metody oryginalnego obiektu i dodatkowo implementują nową funkcję.

Dekoratory są alternatywą dla dziedziczenia. Dziedziczenie rozszerza zachowanie klasy w trakcie kompilacji, w przeciwieństwie do dekoratorów, które rozszerzają klasy w czasie działania programu.

Ponieważ w większości obiektowych języków programowania nie można tworzyć nowych klas podczas działania programu i zwykle nie można przewidzieć z góry wszystkich kombinacji rozszerzeń klas, konieczne by było stworzenie nowej klasy dla każdej kombinacji. Dekoratory są obiektami tworzonymi w czasie działania programu i mogą być łączone w różne kombinacje bezpośrednio przy użyciu.

Przykładowe zastosowanie

Rozważmy okno w graficznym interfejsie użytkownika. By pozwolić na przewijanie jego zawartości, należy dodać do niego poziome lub pionowe paski przewijania. Okna są reprezentowane przez instancję klasy Okno i klasa ta nie powinna posiadać żadnych metod dodających paski przewijania. Można utworzyć podklasę PrzewijaneOkno, która udostępniałaby te metody lub stworzyć OknoDekoratorPrzewijane, który jedynie dodawałby tę funkcję do istniejących obiektów Okno. W tym miejscu działałyby oba rozwiązania.

Teraz załóżmy, że potrzeba dodać ramki dookoła okien. I w tym przypadku klasa Okno nie ma takiej funkcji. Pojawia się problem z podklasą PrzewijaneOkno, bo aby dodać ramki do wszystkich okien, potrzeba stworzyć podklasy OknoZRamką i OknoPrzewijaneZRamką. Problem staje się jeszcze większy z każdą kolejną opcją. W przypadku dekoratorów wystarczy stworzyć jedną klasę OknoDekoratorRamka - podczas działania programu można dynamicznie dekorować istniejące okna z OknoDekoratorPrzewijane lub OknoDekoratorRamka lub oboma.

Przykładem zastosowania wzorca dekoratora jest implementacja strumieni I/O w Javie.

Struktura wzorca

Diagram klas wzorca Dekorator

Konsekwencje stosowania

  1. Zapewnia większą elastyczność niż statyczne dziedziczenie[1].
  2. Pozwala uniknąć tworzenia przeładowanych funkcjami klas na wysokich poziomach hierarchii[1].
  3. Dekorator i powiązany z nim komponent nie są identyczne[1].
  4. Powstawanie wielu małych obiektów[1].

Podobne wzorce

  • Adapter, Kompozyt, Strategia[2].

Przykłady

Zobacz multimedia związane z tematem: Dekorator (wzorzec projektowy)
  • Zobacz przykłady zastosowania wzorca na stronie Wikibooks

Przypisy

  1. a b c d Gamma i in. 2010 ↓, s. 155.
  2. Gamma i in. 2010 ↓, s. 160.

Bibliografia

  • Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Wzorce projektowe. Elementy oprogramowania obiektowego wielokrotnego użytku. Gliwice: Helion, 2010. ISBN 978-83-246-2662-5.

Linki zewnętrzne

  • Szczegółowy opis wzorca wraz z przykładami
  • p
  • d
  • e
Wzorce projektowe według książki Design patterns autorstwa Gangu Czterech
Wzorce kreacyjne
  • Budowniczy
  • Fabryka abstrakcyjna
  • Metoda wytwórcza
  • Prototyp
  • Singleton
Wzorce strukturalne
  • Adapter
  • Dekorator
  • Fasada
  • Kompozyt
  • Most
  • Pełnomocnik
  • Pyłek
Wzorce czynnościowe
  • Interpreter
  • Iterator
  • Łańcuch zobowiązań
  • Mediator
  • Metoda szablonowa
  • Obserwator
  • Odwiedzający
  • Pamiątka
  • Polecenie
  • Stan
  • Strategia