Dekorator (wzorzec projektowy)

Z Wikipedii, wolnej encyklopedii
(Przekierowano z Wzorzec dekoratora)
Przejdź do nawigacji Przejdź do wyszukiwania

Dekoratorwzorzec 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[edytuj | edytuj kod]

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 instancje 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[edytuj | edytuj kod]

Diagram klas wzorca Dekorator

Konsekwencje stosowania[edytuj | edytuj kod]

  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[edytuj | edytuj kod]

Adapter, Kompozyt, Strategia[2].

Przykłady[edytuj | edytuj kod]

Przypisy[edytuj | edytuj kod]

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

Bibliografia[edytuj | edytuj kod]

  • 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.