Wpisany przez Kamil Dworak,
14 sierpnia 2010 20:09
Dekorator (ang. decorator) - wzorzec strukturalny, służy do ulepszania i rozbudowywania obiektów. Załóżmy, że chcemy dodać do jakiejś klasy metodę (niech jeszcze będzie to abstrakcja lub metoda wirtualna, a klasa ta będzie nadklasą dla innych klas). Dzięki dekoratorowi nie musimy tutaj nic modyfikować, możemy nadać obiektowi nowe zachowanie podczas działania programu. Dodatkowo wzorzec ten zapobiega przed eksplozją klas, spowodowaną dużą liczbą rozszerzeń danej klasy (np. kombinacji rożnych składników na pizzy może być mnóstwo!).
Dekorator musi mieć taki sam interfejs jak obiekt, który będziemy dekorować (obiekty dekorujące są tego samego typu co obiekty dekorowane). Do dekoratora przekazujemy dekorowany obiekt. W przeciwieństwie do dziedziczenia, obiekty dostają nowe funkcjonalności dynamicznie ( w trakcie działania programu), a nie na etapie kompilacji. Klient wcale nie musi wiedzieć o działaniu wzorca.
Schemat poniżej ukazuje zastosowanie wzorca:
Dekorator musi mieć taki sam interfejs jak obiekt, który będziemy dekorować (obiekty dekorujące są tego samego typu co obiekty dekorowane). Do dekoratora przekazujemy dekorowany obiekt. W przeciwieństwie do dziedziczenia, obiekty dostają nowe funkcjonalności dynamicznie ( w trakcie działania programu), a nie na etapie kompilacji. Klient wcale nie musi wiedzieć o działaniu wzorca.
Schemat poniżej ukazuje zastosowanie wzorca:
- Tworzymy dwa obiekty: Mercedes i Fiat.
- Sprawdzamy ich opis oraz wartość.
- Rozszerzamy je o klimatyzację, nadpisujemy obiekty o nowe, wywołując konstruktor klasy Klimatyzacja. Do klasy tej przekazaliśmy obiekt, który będziemy dekorować. Teraz przeciążona metoda about wywołuje w sobie oryginalną metodę oraz dodaje do niej informację, o co samochód został wzbogacony.
- Teraz należy zwiększyć cenę takiego wariantu, pobieramy cenę "czystego" samochodu i dodajemy do niej koszty klimatyzacji.
- Nasze obiekty s1 i s2 zostały wzbogacone.
- Adekwatnie postępujemy z dodatkowymi oponami.
- Na koniec widzimy utworzenie obiektu s3, który już od początku jest udekorowany.
Implementacje
Autor | Język programowania | Komentarz | Otwórz | Pobierz | Ocena |
Kamil Dworak | C# | Visual Studio 2008 | .cs | .cs | ***** / 7 |
Kamil Dworak | C/C++ | Visual Studio 2008 | .cpp | .cpp | ***** / 8 |
Kamil Dworak | Java | .java | .java | ***** / 12 | |
Dariusz Rorat | Python | Implementacja z uwzględnieniem dowolej marki samochodu i dowolnych dodatków | .py | .py | ***** / 1 |
Poprawiony: 14 sierpnia 2010 20:18