Sök…


Anmärkningar

Fördelar med att använda Decorator:

  • du kan lägga till nya funktioner under körning i olika konfigurationer
  • bra alternativ för arv
  • klienten kan välja konfiguration han vill använda

Simulera cafeteria

Dekoratör är ett av konstruktionsmönster. Det används för att lägga till, ta bort eller ändra beteende hos objekt. Detta dokument kommer att lära dig hur du använder Decorator DP på rätt sätt.

Låt mig förklara idén med det på ett enkelt exempel. Föreställ dig att du nu är i Starbobs, berömt kaffeföretag. Du kan beställa ett kaffe du vill ha - med grädde och socker, med grädde och toppning och mycket mer kombinationer! Men basen för alla drycker är kaffe - mörk, bitter dryck, du kan ändra. Låt oss skriva ett enkelt program som simulerar kaffemaskin.

Först måste vi skapa och abstrakt klass som beskriver vår basdryck:

public abstract class AbstractCoffee
{
    protected AbstractCoffee k = null;

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

    public abstract string ShowCoffee();
}

Låt oss nu skapa några extrafunktioner, som socker, mjölk och toppning. Skapade klasser måste implementera AbstractCoffee - de kommer att dekorera det:

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";
    }
}

Nu kan vi skapa vårt favoritkaffe:

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());

    }
}

Att köra koden ger följande utgång:

Kaffe med toppning med socker med mjölk



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow