Jaka jest różnica pomiędzy wzorcem "dekorator" a zwykłym dziedziczeniem?

0

Zastanawiam się nad różnicą pomiędzy dekoratorem a zwykłym dziedziczeniem. Jaka jest poza tym, że mówi się iż obiekt jest robiony dynamicznie.. no dobra przeciez w trakcie dzialania programu mogę sobie nawet przy zwyklym dziedziczeniu w dowolnym momencie stworzyć obiekt jakiejś klasy pochodnej więc o co chodzi?

0

Ale jak chcesz mieć funkcjonalność która nie powinna być dziedziczona - bo coś tam ?

1

Dekorator pozwala na łatwe komponowanie "dekoracji" bez przymusu tworzenia za każdym razem nowej klasy. Przykładowo mamy klasy z różnymi rodzajami kaw i różnymi dekoratorami:

using System;

interface Kawa { int Smak(); }

class Czarna : Kawa { public int Smak() { return 19; } }
class Espresso : Kawa { public int Smak() { return 36; } }
class Latte : Kawa { public int Smak() { return 47; } }

class KawaZMlekiem : Kawa
{
private Kawa baza;
public KawaZMlekiem(Kawa baza) { this.baza = baza; }
public int Smak() { return baza.Smak() + 20; }
}

class KawaZeSmietanka : Kawa
{
private Kawa baza;
public KawaZeSmietanka(Kawa baza) { this.baza = baza; }
public int Smak() { return baza.Smak() + 25; }
}

class KawaZCukrem : Kawa
{
private Kawa baza;
public KawaZCukrem(Kawa baza) { this.baza = baza; }
public int Smak() { return baza.Smak() + 15; }
}

public class Test
{
public static void Main()
{
Kawa ulubiona = new KawaZCukrem(new KawaZMlekiem(new Czarna()));
Console.WriteLine(ulubiona.Smak());
}
}


Wynik to: `54`

Nie musimy tworzyć osobnej klasy dla każdej możliwej kombinacji dekoratorów i baz.
1

Akurat przykład przytoczony przez @Oak mimo, że pozwala w w łatwy sposób zrozumieć zasadzę działania tego wzorca, niestety może doprowadzić do powstania "klasozy". Rozumiem, że to tylko przykład - ale nowa klasa posiadająca tylko inną wartość pola, może kogoś zmylić, zwłaszcza, że to dział newbie. Ponadto trzeba pamiętać o prawidłowych nazwach klas, bo na końcu jak w przykładzie możemy dostać, że DodajCukier jest jakimś rodzajem kawy ;)

0
ikolpo napisał(a):

nowa klasa posiadająca tylko inną wartość pola

Przecież nie będę rozpisywał przykładu na 3 strony A4. :) Proste przykłady są najlepsze.

1 użytkowników online, w tym zalogowanych: 0, gości: 1