web-dev-qa-db-fra.com

Différences entre les motifs de proxy et de décorateur

Pouvez-vous donner une bonne explication quelle est la différence entre Proxy et Décorateur ?

La principale différence que je vois est que lorsque nous supposons que Proxy utilise composition et Décorateur utilise agrégation il semble alors évident que l’utilisation de plusieurs (un ou plusieurs) Décorateurs vous pouvez modifier/ajouter des fonctionnalités à une instance préexistante (décorer), alors que Proxy possède sa propre instance interne de classe mandatée et y est déléguée en ajoutant des fonctionnalités supplémentaires (comportement du proxy).

La question est - Est-ce que le proxy créé avec agrégation est toujours le proxy ou plutôt le décorateur ? Est-il permis (par définition dans les modèles GoF) de créer Proxy avec agrégation?

95

Decorator Pattern se concentre sur l'ajout dynamique de fonctions à un objet, tandis que Proxy Pattern se concentre sur le contrôle de l'accès à un objet.

MODIFIER:-

La relation entre Proxy et le sujet réel est généralement définie au moment de la compilation. Proxy l'instancie de quelque manière que ce soit, alors que Decorator est affecté au sujet au moment de l'exécution, ne connaissant que l'interface du sujet. 

67
Rahul Tripathi

La réponse acceptée n'est pas tout à fait correcte. La vraie différence n'est pas la propriété (composition ou agrégation), mais plutôt l'information de type.

Un Décorateur est toujours passé son délégué. Un Proxy pourrait le créer lui-même ou il {pourrait} _ le faire injecter.

Mais un Proxy toujours connaît le type (plus) spécifique du délégataire. En d'autres termes, le Proxy et son mandataire auront le même type de base, mais le Proxy pointe vers un type dérivé. A Decorator pointe vers son propre type de base. Ainsi, la différence réside dans les informations au moment de la compilation sur le type du délégataire.

Dans un langage dynamique, si le délégataire est injecté et possède la même interface, il n'y a pas de différence.

La réponse à ta question est oui".

81
cdunn2001

Décorateur obtenir une référence pour un objet décoré (généralement par le constructeur) tandis que Proxy responsable de le faire lui-même.

Proxy ne peut pas du tout instancier l'objet wrapping (comme cela fait les ORM pour empêcher un accès inutile à la base de données si les champs/getters d'objet ne sont pas utilisés) tandis que Decorator maintient toujours le lien vers l'instance encapsulée.

Proxy généralement utilisé par les frameworks pour ajouter de la sécurité ou la mise en cache/lazing et construit par framework (et non par le développeur habituel lui-même).

Decorator est généralement utilisé pour ajouter un nouveau comportement à des classes anciennes ou héritées par le développeur lui-même, basé sur l'interface plutôt que sur la classe réelle (il fonctionne donc sur une large gamme d'instances d'interface, Proxy est autour d'une classe concrète).

37
gavenkoa

Principales différences: _

  1. Proxy fournit la même interface. Decorator fournit une interface améliorée.
  2. Decorator et Proxy ont des buts différents mais des structures similaires. Les deux décrivent comment fournir un niveau d'indirection à un autre objet, et les implémentations conservent une référence à l'objet auquel elles transmettent des demandes.
  3. Decorator peut être vu 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.
  4. Decorator prend en charge les méthodes récursives composition _
  5. La classe Decorator déclare une relation composition avec l'interface LCD (dénominateur de classe le plus bas) et ce membre de données est initialisé dans son constructeur.
  6. Utilisez Proxy pour l’initialisation lente, l’amélioration des performances en mettant l’objet en cache et contrôle de l’accès au client/appelant

Sourcemaking article cite les similitudes et les différences de manière excellente.

Questions/liens SE connexes:

Quand utiliser le motif de décorateur?

Quelle est la différence exacte entre les modèles d'adaptateur et de proxy?

14
Ravindra babu

Les mandataires et les décorateurs ont des objectifs différents et se concentrent sur la mise en œuvre interne. Le proxy sert à utiliser un objet distant, inter-processus ou inter-réseau comme s'il s'agissait d'un objet local. Decorator est pour ajouter un nouveau comportement à l'interface d'origine.

Bien que la structure des deux modèles soit similaire, le gros de la complexité de Proxy consiste à assurer une communication correcte avec l'objet source. Decorator, quant à lui, se concentre sur la mise en œuvre du comportement ajouté. 

0
James Lin