6
votes

Alternatives au motif de décorateur

Je trouve le motif de décorateur pour être le plus déroutant. Veuillez considérer l'exemple fourni dans "Livre de la première designs de conception".

text alt p> Donc pour obtenir un darkroast em> avec double moka et un fouet, vous devez écrire p> xxx pré>

je pense que cela est inutile. Voici ma mise en œuvre, P>

interface Beverage
{
   int Cost();
}

class DarkRoast : Beverage
{
   /* .... */
}

class Mocha : Beverage
{
   /* .... */
}

class Whip : Beverage
{
   /* .... */
}

// here is the changed part
class Order
{
    List<Beverage> beverages = new List<Beverage> beverages();
    public void AddItem(Beverage b)
    {
        beverages.Add(b);
    }

    public int Cost()
    {
        int cost;
        foreach(Beverage b in beverages)
            cost += b.Cost();
    }
}

// use it like
Order order = new Order();
order.AddItem(new DarkRoast());
order.AddItem(new Mocha());
order.AddItem(new Mocha());
order.AddItem(new Whip());
int cost = order.Cost();


0 commentaires

3 Réponses :


15
votes

Non, ils ne sont pas les mêmes.

La tête premier exemple a 1 boisson avec moka, fouet, rôti ajouté. Votre exemple a 3 boissons.
Voir ce premier code de la tête. Il fonctionne sur le même exemple de la boisson xxx

Votre code crée 3 boissons (ce qui signifie que quelqu'un a commandé 3 choses séparément).
Dans la vie réelle, ce ne sont pas des boissons, je suppose. La boisson est une et des saveurs ajoutées sur le dessus.

Le but de la décorateur est - à décorer. .NET a un textwriter et un indentedtextwriter (je suppose), qui prend essentiellement le texte normal de la vôtre et applique l'indentation. Il est similaire aux tuyaux Unix d'une manière d'une manière, si vous y pensez.

entrée -> Tweaks -> Entrée modifiée -> En outre Tweaks -> Entrée en outre.
La sortie de l'opération de courant devient entrée pour une opération suivante.

Je ne sais pas si je l'ai bien expliqué.


3 commentaires

Voir ce premier code de la tête. Cela fonctionne sur le même exemple de la boisson. Ce n'est pas le même exemple. Chaque décorateur ultérieur prend une instance de la précédente. C'est la même variable mais il est attribué différentes instances.


@CODINGYOSHI: Oui. Ce que je voulais dire, c'est que la même variable est utilisée et une nouvelle instance enveloppe une instance existante pour créer une nouvelle boisson. Merci :)


@Edwardolamisan: OP montre une alternative possible au décorateur et ne pas demander des alternatives.



10
votes

Le point entier du motif de décorateur consiste à ajouter des responsabilités via la composition d'objet, pas d'héritage. L'héritage est statique, obj. La composition est dynamique et plus flexible. Les possibilités de décoration sont infinies. Il est également possible de décorer un objet pendant l'exécution.


1 commentaires

Pouvez-vous donner plus d'idées sur l'ONU-décoration?



1
votes

Je pense que vous représentez réellement quelque chose de complètement différent.

Dans votre exemple, vous avez un ordre d'appel d'objet qui reçoit des boissons et dans la première fois, ils décorent simplement une boisson avec des garnitures, cela provoque le problème principal suivant.

dans votre code de commande, vous pouvez placer plusieurs boissons, le cas échéant, et vous placez plus d'une garniture, quelle garniture va avec chaque boisson?


0 commentaires