Dekorator (wzorzec projektowy)
Z Wikipedii
| Ten artykuł wymaga dopracowania zgodnie z zaleceniami edycyjnymi. Należy w nim poprawić/wykonać działania: Patrz: Zalecenia edycyjne dla wzorców projektowych. Po wyeliminowaniu niedoskonałości prosimy usunąć szablon {{Dopracować}} z kodu tego artykułu. |
Wzorzec dekoratora to w inżynierii oprogramowania jeden ze wzorców projektowych należący do grupy wzorców strukturalnych. Pozwala na dodanie nowej funkcjonalności 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ą funkcjonalność.
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ładem wzorca dekoratora jest implementacja strumieni I/O w Javie.
[edytuj] Cel
Rozważmy okno w graficznym interfejsie użytkownika. By pozwolić na przewijanie jego zawartości, chcemy dodać do niego poziome lub pionowe paski przewijania. Załóżmy, że okna są reprezentowane przez instancje klasy Okno i że ta klasa nie ma żadnych metod dodających paski przewijania. Moglibyśmy stworzyć podklasę PrzewijaneOkno, która udostępniałaby te metody lub stworzyć OknoDekoratorPrzewijane, który jedynie dodawałby tą funkcjonalność 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 funkcjonalności. Pojawia się problem z podklasą OknoPrzewijane, 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.
[edytuj] Przykłady
|
||||||||||||||


