konto usunięte

Temat: c# Dekoratory i sens użycia

Witam,

Może mi ktoś wyjaśnić sens użycia wzorca dekoratora. Mam głóną klasę abstrakcyjną i klasę pochodna. Następnie tworzę klasę abstrakcyjną dekoratora dziedziczącą od klasy głównej i klasę pochodna od niego.
Czyli wychodzi to co poniżej:


public abstract class Beverage
{
public string description = "No description";
public abstract string getDescription();
public abstract double cost();
}

public class Coffee : Beverage
{
public Coffee() { description = "coffe"; }
public override double cost()
{
return 1.55;
}
public override string getDescription()
{
return description;
}
}

public abstract class Decoration : Beverage
{}

public class Feather : Decoration
{
Beverage beverage;
public Feather(Beverage beverage)
{
this.beverage = beverage;
}
public override string getDescription()
{
return beverage.getDescription() + ", Mocha";
}
public override double cost()
{
return .20 + beverage.cost();
}
}


Dalej w programie tworzę obiekty i wywołuję funkcje cost i getDesription.


Beverage beverage = new Coffee();
beverage = new Feather(beverage);
System.Console.WriteLine(beverage.getDescription() + beverage.cost());


To po co tak zawile tego używać skoro można wyrzucić klase abstrakcyjną dekoratora, klasa od niego pochodna zostanie klasą podstawową (skasować w tej klasie oveerridy) i wywołać to tak:


Feather bever = new Feather(beverage);
System.Console.WriteLine(bever.getDescription() + bever.cost());

Wynik ten sam.
Co zyskujemy na stosowaniu dekoratora?

konto usunięte

Temat: c# Dekoratory i sens użycia

W Twoim przypadku masz rację. Ale tak możesz tylko raz udekorować klasę. Jeśli usuniesz klasę dekoratora to

Feather bever = new Feather(beverage);
Console.WriteLine(bever.getDescription() + bever.cost())
// poniższa linia zgłosi błąd bo Feather nie dziedziczy
// po Beverage poprzez klasę Decoration
bever = new Feather(bever)

A chodzi o to aby móc tak w nieskończoność. Jakoś mi się nie podoba Twoja implementacja tego wzorca to podsyłam moje drobne poprawki.

public abstract class Beverage
{
public string Description = "No description";
public abstract string GetDescription();
public double Cost = 0;
public abstract double GetCost();
}

public abstract class Decorator : Beverage
{
public override string GetDescription()
{
return base.Description;
}

public override double GetCost()
{
return base.Cost;
}
}

public class Coffe : Beverage
{
public Coffe()
{
base.Description = "Cofee";
base.Cost = 10d;
}

public override string GetDescription()
{
return base.Description;
}

public override double GetCost()
{
return base.Cost;
}
}

public class Chocolate : Decorator
{
public Chocolate(Beverage beverage)
{
base.Description = beverage.Description + ", Chocolate";
base.Cost = beverage.Cost + 2d;
}
}

public class WhippedCream : Decorator
{
public WhippedCream(Beverage beverage)
{
base.Description = beverage.Description + ", WhippedCream";
base.Cost = beverage.Cost + 2d;
}
}

class Program
{
static void Main(string[] args)
{
Beverage coffe = new Coffe();
Console.WriteLine(coffe.GetCost() + "pln: " + coffe.GetDescription());
coffe = new WhippedCream(coffe);
Console.WriteLine(coffe.GetCost() + "pln: " + coffe.GetDescription());
coffe = new Chocolate(coffe);
Console.WriteLine(coffe.GetCost() + "pln: " + coffe.GetDescription());

Console.ReadKey(false);
}
}

Mało czytelne w GoldenLine ale jak wrzuciś do VS to powinno być lepiej. Rzuć okiem na to. Może to będzie bardziej czytelne. Zauważ jak szybko można tym sposobem tworzyć klasy dekorujące i jak łatwo je utrzymywać o używaniu już nie wspomnę.Krzysztof Drelczuk edytował(a) ten post dnia 17.11.09 o godzinie 21:43

konto usunięte

Temat: c# Dekoratory i sens użycia

Już chyba rozumiem :) w moim przypadku do Fever bever nie mogę przypisać kolejnej równorzędnej(nowej) "dekoracji" bo będzie ona innego typu. Więc zostaje mi jedna kawa z jedną dekoracją zgadza się?

konto usunięte

Temat: c# Dekoratory i sens użycia

Otóż to.

konto usunięte

Temat: c# Dekoratory i sens użycia

Dziękuję za wyjaśnienie



Wyślij zaproszenie do