2017-06-01 1 views
0

Je dois faire un projet qui utilise au moins trois modèles de conception. À la première fois, j'ai essayé d'utiliser un motif de constructeur avec un motif de décorateur, mais mon professeur m'a dit que je devrais connecter les deux avec un motif composite. J'ai essayé d'imaginer une structure d'uml mais c'est trop dur pour moi. Quelqu'un pourrait-il m'aider? Comment les connecter?Motifs de conception: Builder + Décorateur + Composite

Répondre

1

gof dit:

Un décorateur peut être considéré comme un composite dégénéré avec un seul composant. Cependant, un décorateur ajoute des responsabilités supplémentaires - il n'est pas destiné à l'agrégation d'objets.

et:

Composite (163) est ce que le constructeur construit souvent.

Voici un composite avec un décorateur. essayez d'ajouter un constructeur.

package p; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 
public class So44300051 { 
    static abstract class Component { 
     Component(String name) { 
      this.name=name; 
     } 
     abstract boolean add(Component component); 
     abstract boolean remove(Component component); 
     abstract List<Component> children(); 
     void visit() { 
      System.out.println(this); 
      if(this instanceof Decorator1) 
       ((Decorator1)this).additionalBehaviour1(); 
      for(Component child:children()) 
       child.visit(); 
     } 
     final String name; 
    } 
    static class Composite extends Component { 
     Composite(String name) { 
      super(name); 
     } 
     @Override boolean add(Component component) { 
      return children.add(component); 
     } 
     @Override boolean remove(Component component) { 
      return children.remove(component); 
     } 
     @Override List<Component> children() { 
      return Collections.unmodifiableList(children); 
     } 
     @Override public String toString() { 
      return "Composite [name="+name+"]"; 
     } 
     final List<Component> children=new ArrayList<>(); 
    } 
    static class Leaf extends Component { 
     Leaf(String name) { 
      super(name); 
     } 
     @Override boolean add(Component component) { 
      return false; 
     } 
     @Override boolean remove(Component component) { 
      return false; 
     } 
     @Override List<Component> children() { 
      return Collections.emptyList(); 
     } 
     @Override public String toString() { 
      return "Leaf [name="+name+"]"; 
     } 
    } 
    static abstract class Decorator extends Component { 
     Decorator(Component component) { 
      super(component.name); 
      this.component=component; 
     } 
     @Override boolean add(Component component) { 
      return this.component.add(component); 
     } 
     @Override boolean remove(Component component) { 
      return this.component.remove(component); 
     } 
     @Override List<Component> children() { 
      return this.component.children(); 
     } 
     @Override public String toString() { 
      return getClass().getSimpleName()+" "+component; 
     } 
     final Component component; 
    } 
    static class Decorator1 extends Decorator { 
     Decorator1(Component component) { 
      super(component); 
     } 
     void additionalBehaviour1() { 
      System.out.println("additional behaviour 1."); 
     } 
    } 
    public static void main(String[] args) { 
     Component root=new Composite("root"); 
     root.add(new Leaf("leaf 1")); 
     root.add(new Decorator1(new Leaf("leaf2"))); 
     root.visit(); 
    } 
} 
0

Design Pattern Combination Image

Disons que nous avons un objet complexe qui possède de nombreuses propriétés (composants) maintenant ce composant peut contenir d'autres composants. Nous pouvons donc créer cet objet complexe en utilisant un modèle Builder et l'objet résultant sera un composite Et maintenant ce composant peut être modifié en appliquant des responsabilités supplémentaires en utilisant le motif de conception de décorateur

Prenons un exemple de commande et un groupe de commande Component - commande étend le composant - prononcez une commande chauve-souris écho GroupOfCommand extension des composants - contiendra la liste de l'écho de commandes, écho, écho

maintenant Ce composant peut avoir plusieurs paramètres à passer comme ComponentBuilder(). SetCommand ("echo"). SetArgument ("bonjour"). SetArgument ("monde"). Build();

décorateur prolongera composants et contient le composant donc procédé Component.execute() sera la partie de décorateur WrapWithBrackerDecorator exécuter procédé sera comme

public String execute(){ 
return "(" +component.execute() +")"; 
}