Szukaj…


Uwagi

Plusy korzystania z Dekoratora:

  • możesz dodawać nowe funkcjonalności w czasie wykonywania w różnych konfiguracjach
  • dobra alternatywa dla dziedziczenia
  • klient może wybrać konfigurację, której chce użyć

Symulowanie stołówki

Dekorator jest jednym z wzorów konstrukcyjnych. Służy do dodawania, usuwania lub zmiany zachowania obiektu. Ten dokument nauczy Cię, jak prawidłowo używać Decorator DP.

Pozwól, że wyjaśnię ci ten pomysł na prostym przykładzie. Wyobraź sobie, że jesteś teraz w słynnej firmie kawowej Starbobs. Możesz złożyć zamówienie na dowolną kawę - ze śmietaną i cukrem, ze śmietaną i polewą i wieloma innymi kombinacjami! Ale podstawą wszystkich napojów jest kawa - ciemny, gorzki napój, który można modyfikować. Napiszmy prosty program symulujący ekspres do kawy.

Najpierw musimy stworzyć abstrakcyjną klasę opisującą nasz napój podstawowy:

public abstract class AbstractCoffee
{
    protected AbstractCoffee k = null;

    public AbstractCoffee(AbstractCoffee k)
    {
        this.k = k;
    }

    public abstract string ShowCoffee();
}

Teraz stwórzmy dodatki, takie jak cukier, mleko i polewy. Utworzone klasy muszą implementować AbstractCoffee - będą je ozdabiać:

public class Milk : AbstractCoffee
{
    public Milk(AbstractCoffee c) : base(c) { }
    public override string ShowCoffee()
    {
        if (k != null)
            return k.ShowCoffee() + " with Milk";
        else return "Milk";
    }
}
public class Sugar : AbstractCoffee
{
    public Sugar(AbstractCoffee c) : base(c) { }

    public override string ShowCoffee()
    {
        if (k != null) return k.ShowCoffee() + " with Sugar";
        else return "Sugar";
    }
}
public class Topping : AbstractCoffee
{
    public Topping(AbstractCoffee c) : base(c) { }

    public override string ShowCoffee()
    {
        if (k != null) return k.ShowCoffee() + " with Topping";
        else return "Topping";
    }
}

Teraz możemy stworzyć naszą ulubioną kawę:

public class Program
{
    public static void Main(string[] args)
    {
        AbstractCoffee coffee = null; //we cant create instance of abstract class
        coffee = new Topping(coffee); //passing null
        coffee = new Sugar(coffee); //passing topping instance
        coffee = new Milk(coffee);  //passing sugar
        Console.WriteLine("Coffee with " + coffee.ShowCoffee());

    }
}

Uruchomienie kodu spowoduje wygenerowanie następującego wyniku:

Kawa z polewą cukrową z mlekiem



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow