181 votes

Aidez-moi à comprendre le "motif de décorateur" avec un exemple concret.

J'étudiais le modèle de décorateur tel que documenté dans GOF . Cela me semble être un modèle de conception compliqué.

Alors s'il vous plaît, aidez-moi à comprendre le motif de décorateur . Quelqu'un pourrait-il donner un exemple d'utilisation où cela est utile dans le monde réel?

238voto

this. __curious_geek Points 23728

Décorateur modèle permet d'atteindre un objectif unique de l'ajout dynamique de responsabilités à n'importe quel objet.

Prenons le cas d'une boutique de pizza. Dans la pizza shop on aura de la vente de quelques variétés de pizza et ils seront également fournir des garnitures dans le menu. Maintenant, imaginez une situation dans laquelle, si la boutique de pizza a fournir des prix pour chaque combinaison de la pizza et de la garniture. Même si il y en a quatre de base de pizzas et de 8 différentes garnitures, l'application serait fou d'entretenir tous ces béton combinaison de pizzas et de garnitures.

Voici le pattern décorateur.

Comme par le décorateur modèle, vous mettrez en œuvre les garnitures, comme les décorateurs et les pizzas seront décorées par ces garnitures' décorateurs. Pratiquement chaque client voudra garnitures de sa volonté et de son projet de loi final-montant sera composé de la base de pizzas et commandés en plus de garnitures. Chaque garniture décorateur voudrais savoir sur les pizzas que c'est de la décoration et des prix. GetPrice() la méthode de remplissage de l'objet serait de retour cumulée du prix à la fois de la pizza et de la garniture.

MODIFIER

Voici un code d'exemple de l'explication ci-dessus.

public abstract class BasePizza
{
    protected double myPrice;

    public virtual double GetPrice()
    {
        return this.myPrice;
    }
}

public abstract class ToppingsDecorator : BasePizza
{
    protected BasePizza pizza;
    public ToppingsDecorator(BasePizza pizzaToDecorate)
    {
        this.pizza = pizzaToDecorate;
    }

    public override double GetPrice()
    {
        return (this.pizza.GetPrice() + this.myPrice);
    }
}

class Program
{
    [STAThread]
    static void Main()
    {
        //Client-code
        Margherita pizza = new Margherita();
        Console.WriteLine("Plain Margherita: " + pizza.GetPrice().ToString());

        ExtraCheeseTopping moreCheese = new ExtraCheeseTopping(pizza);
        ExtraCheeseTopping someMoreCheese = new ExtraCheeseTopping(moreCheese);
        Console.WriteLine("Plain Margherita with double extra cheese: " + someMoreCheese.GetPrice().ToString());

        MushroomTopping moreMushroom = new MushroomTopping(someMoreCheese);
        Console.WriteLine("Plain Margherita with double extra cheese with mushroom: " + moreMushroom.GetPrice().ToString());

        JalapenoTopping moreJalapeno = new JalapenoTopping(moreMushroom);
        Console.WriteLine("Plain Margherita with double extra cheese with mushroom with Jalapeno: " + moreJalapeno.GetPrice().ToString());

        Console.ReadLine();
    }
}

public class Margherita : BasePizza
{
    public Margherita()
    {
        this.myPrice = 6.99;
    }
}

public class Gourmet : BasePizza
{
    public Gourmet()
    {
        this.myPrice = 7.49;
    }
}

public class ExtraCheeseTopping : ToppingsDecorator
{
    public ExtraCheeseTopping(BasePizza pizzaToDecorate)
        : base(pizzaToDecorate)
    {
        this.myPrice = 0.99;
    }
}

public class MushroomTopping : ToppingsDecorator
{
    public MushroomTopping(BasePizza pizzaToDecorate)
        : base(pizzaToDecorate)
    {
        this.myPrice = 1.49;
    }
}

public class JalapenoTopping : ToppingsDecorator
{
    public JalapenoTopping(BasePizza pizzaToDecorate)
        : base(pizzaToDecorate)
    {
        this.myPrice = 1.49;
    }
}

alt text

EDIT2

posté ceci sur mon blog ici.

39voto

Anurag Points 66470

Il s’agit d’un exemple simple d’ajouter de nouveau comportement à un objet existant dynamiquement, ou le modèle Decorator. En raison de la nature des langages dynamiques tels que Javascript, ce modèle devient partie intégrante de la langue elle-même.

23voto

frankc Points 6014

Il est à noter que le modèle d’e/s de Java est basé sur le pattern décorateur. La superposition de ce lecteur sur le dessus de ce lecteur sur le dessus de... est un exemple de vraiment réel du décorateur.

3voto

Jonty Points 11

Qu'est-ce que Décorateur en Java.

La définition formelle de l'Décorateur modèle à partir du GoF livre (Design Patterns: Elements de Logiciels Orientés Objets Réutilisables, 1995, Pearson Education, Inc. La publication en tant Pearson Addison Wesley) vous dit que vous pouvez,

"Joindre des responsabilités supplémentaires à un objet de façon dynamique. Les décorateurs fournir une alternative souple de sous-classement pour l'extension de la fonctionnalité".

Disons que nous avons une Pizza et nous tenons à le décorer avec des garnitures comme le Poulet Masala, de l'Oignon et de Fromage Mozzarella. Nous allons voir comment l'implémenter en Java ...

Programme pour montrer comment mettre en oeuvre le Décorateur Modèle de Conception en Java.

Pizza.java:

<!-- language-all: lang-html -->

package com.hubberspot.designpattern.structural.decorator;

public class Pizza {

public Pizza() {

}

public String description(){
    return "Pizza";
}

}



package com.hubberspot.designpattern.structural.decorator;

public abstract class PizzaToppings extends Pizza {

public abstract String description();

}

package com.hubberspot.designpattern.structural.decorator;

public class ChickenMasala extends PizzaToppings {

private Pizza pizza;

public ChickenMasala(Pizza pizza) {
    this.pizza = pizza;
}

@Override
public String description() {
    return pizza.description() + " with chicken masala, ";
}

}



package com.hubberspot.designpattern.structural.decorator;

public class MozzarellaCheese extends PizzaToppings {

private Pizza pizza;

public MozzarellaCheese(Pizza pizza) {
    this.pizza = pizza;
}

@Override
public String description() {
    return pizza.description() + "and mozzarella cheese.";
}
}



package com.hubberspot.designpattern.structural.decorator;

public class Onion extends PizzaToppings {

private Pizza pizza;

public Onion(Pizza pizza) {
    this.pizza = pizza;
}

@Override
public String description() {
    return pizza.description() + "onions, ";
}

}



package com.hubberspot.designpattern.structural.decorator;

public class TestDecorator {

public static void main(String[] args) {

    Pizza pizza = new Pizza();

    pizza = new ChickenMasala(pizza);
    pizza = new Onion(pizza);
    pizza = new MozzarellaCheese(pizza);

    System.out.println("You're getting " + pizza.description());

}

}

1voto

gm2008 Points 257

Il y a un exemple sur Wikipédia à propos de la décoration d'une fenêtre avec barre de défilement:

http://en.wikipedia.org/wiki/Decorator_pattern

Voici un autre très "monde réel" exemple de "membre de l'Équipe, de chef d'équipe et gestionnaire", ce qui montre que décorateur modèle est irremplaçable avec l'héritage simple:

http://zishanbilal.com/2011/04/28/design-patterns-by-examples-decorator-pattern/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X