Question

Je commence tout juste à apprendre des modèles de conception et j'ai deux questions liées au décorateur ...

Je me demandais pourquoi le modèle décorateur suggère que le décorateur de mettre en œuvre toutes les méthodes publiques du composant dont il décore?

ne peut pas la classe décorateur juste être utilisé pour fournir les comportements supplémentaires, puis le composant en béton (qui est passé en elle) juste être utilisé pour appeler tout le reste?

Et d'autre part, si l'élément en béton que vous voulez décorer ne dispose pas d'une classe de base que le décorateur abstrait peut également découler de?

Merci d'avance!

Était-ce utile?

La solution

Je pense que vous avez mal compris ont décorateur. Vous pensez d'un simple cas d'extension d'une classe concrète avec des fonctionnalités supplémentaires. Dans ce cas, oui dans la plupart des langues OO la classe dérivée peut simplement permettre à sa superclasse de gérer toutes les méthodes inappliquées.

class Base {

  function foo() {
    return "foo";
  }

  function bar() {
    return "bar";
  }

}

// Not what we think of as a Decorator,
// really just a subclass.
class Decorator extends Base {

  // foo() inherits behavior from parent Base class 

  function bar() {
    return parent::bar() . "!"; // add something
  }

}

Une classe Décorateur ne pas étendre la classe de base de sa catégorie « décorée ». Il est un autre type, qui a un objet membre de la classe décorée. Ainsi, il doit mettre en œuvre la même interface, si seulement pour appeler la méthode correspondante de l'objet décoré.

class Decorator { // extends nothing
  protected $base;

  function __construct(Base $base) {
    $this->base = $base;
  }

  function foo() {
    return $base->foo();
  }

  function bar() {
    return $base->foo() . "!"; // add something
  }

}

Il pourrait être utile de définir une Interface (si votre langue prend en charge une telle chose) tant pour la classe décorée et la classe décorateur. De cette façon, vous pouvez vérifier au moment de la compilation que le décorateur met en œuvre la même interface.

interface IBase {
  function foo();
  function bar();
}

class Base implements IBase {
  . . .
}

class Decorator implements IBase {
  . . .
}

Re: Commentaire de @Yossi Dahan: Je vois l'ambiguïté dans l'article wikipedia, mais si vous lisez attentivement, il ne dit que le composant étant décoré est un champ dans l'objet décorateur, et que la composant est passé en argument au constructeur du décorateur. Ceci est différent de l'héritage.

Bien que l'article wikipedia dit le décorateur hérite du composant, vous devriez penser à cela comme la mise en œuvre d'une interface, comme je l'ai montré dans l'exemple ci-dessus PHP. Le décorateur doit encore proxy pour l'objet composant, ce qui ne serait pas si elle avait hérité. Cela permet au décorateur de décorer un objet de une catégorie qui implémente cette interface.

Voici quelques extraits de "Design Patterns: Elements de logiciel orienté objet réutilisable" par Gamma, Helm, Johnson et Vlissides:

  

Décorateur

     

Intention

     

Joindre des responsabilités supplémentaires à un objet   dynamiquement. Décorateurs fournissent une   alternative flexible à subclassing   pour étendre la fonctionnalité.

     

Motivation

     

...   Un décorateur conforme à l'interface de   le composant il décore de sorte que sa   présence est transparente pour le   Les clients de composants.

     

Participants

     
      
  • Décorateur   maintient une référence à un objet et le composant définit une interface   qui est conforme à l'interface de composant.
  •   

Autres conseils

  

Je me demandais pourquoi le modèle décorateur suggère que le décorateur de mettre en œuvre toutes les méthodes publiques du composant dont il décore?

Un décorateur devrait être une baisse de remplacement pour le composant, il décore, avec des fonctionnalités supplémentaires (la « décoration »). Cela ne peut se produire si elle met en œuvre complètement l'interface du composant.

  

ne peut pas la classe décorateur juste être utilisé pour fournir les comportements supplémentaires, puis le composant en béton (qui est passé en elle) juste être utilisé pour appeler tout le reste?

Cela fait des hypothèses sur la façon dont le décorateur est mis en œuvre. Vous ne pouvez pas être sûr que l'ensemble de l'interface publique du composant, il décore est passé directement à travers. Il est possible que le décorateur remplace certaines méthodes dans sa mise en œuvre.

  

Et d'autre part, si l'élément en béton que vous voulez décorer ne dispose pas d'une classe de base que le décorateur abstrait peut également découler de?

Décorateurs héritent généralement la classe du composant, ils sont la décoration, pas la base de la composante.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top