206 votes

Différences entre les modèles Proxy et Decorator

Pouvez-vous nous expliquer quelle est la différence entre Proxy y Décorateur ?

La principale différence que je vois est que lorsque nous supposons que Proxy utilise composition y Décorateur utilise agrégation alors il semble clair qu'en utilisant de multiples (un ou plusieurs) Décorateurs vous pouvez modifier ou ajouter des fonctionnalités à une instance préexistante (décoration), alors que Proxy possède sa propre instance interne de la classe mandataire et lui délègue certaines fonctionnalités supplémentaires (comportement du mandataire).

La question est : est-ce que Proxy créé par l'agrégation est toujours Proxy ou plutôt Décorateur ? Est-il permis (par définition dans les schémas du GoF) de créer Proxy avec l'agrégation ?

151voto

cdunn2001 Points 3597

La véritable différence n'est pas la propriété (composition contre agrégation), mais plutôt le type d'information.

A Décorateur est toujours a passé son délégataire. A 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 délégué auront le même type de base, mais l'élément Proxy pointe vers un type dérivé. A Décorateur pointe vers son propre type de base. Ainsi, la différence réside dans l'information au moment de la compilation sur le type du délégataire.

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

La réponse à votre question est "Oui".

107voto

Rahul Tripathi Points 1

Décorateur se concentre sur l'ajout dynamique de fonctions à un objet, tandis que le modèle Proxy Le modèle se concentre sur le contrôle de l'accès à un objet.

EDIT:-

Relation entre un Proxy et le sujet réel est généralement défini au moment de la compilation, Proxy l'instancie d'une certaine manière, alors que Décorateur est assigné au sujet au moment de l'exécution, ne connaissant que l'interface du sujet.

94voto

jaco0646 Points 702

Voici la citation directe du GoF (page 216).

Bien que les décorateurs puissent avoir des implémentations similaires à celles des proxies, les décorateurs ont un objectif différent. Un décorateur ajoute une ou plusieurs responsabilités à un objet, alors qu'un proxy contrôle l'accès à un objet.

Les mandataires varient dans la mesure où ils sont mis en œuvre comme un décorateur. A protection peut être implémenté exactement comme un décorateur. En revanche, un proxy En revanche, un proxy distant ne contiendra pas de référence directe à son sujet réel, mais seulement une référence indirecte. une référence indirecte, telle que "l'identifiant de l'hôte et l'adresse locale de l'hôte". Un proxy virtuel commencera par une référence indirecte, telle qu'un nom de fichier, mais pourra éventuellement obtenir et utiliser une référence directe.

Les réponses populaires indiquent qu'un Proxy connaît le type concret de son délégué. D'après cette citation, nous pouvons voir que ce n'est pas toujours vrai.

La différence entre le mandataire et le décorateur selon le GdF est que le mandataire restreint le client. Le décorateur ne le fait pas. Le mandataire peut restreindre ce qu'un client fait en contrôlant l'accès à la fonctionnalité ; ou il peut restreindre ce qu'un client connaît en effectuant des actions qui sont invisibles et inconnues du client. Le décorateur fait le contraire : il améliore ce que fait son délégué d'une manière visible pour les clients.

On pourrait dire que le Proxy est une boîte noire alors que le Decorator est une boîte blanche.

La relation de composition entre le wrapper et le délégué est la mauvaise relation sur laquelle se concentrer lorsqu'on oppose le Proxy au Decorator, car la composition est la caractéristique que ces deux modèles ont en commun. La relation entre le wrapper et le client est ce qui différencie ces deux modèles.

  • Decorator informe et responsabilise son client.
  • Le mandataire restreint et prive son client de ses droits.

61voto

gavenkoa Points 6974

Décorateur obtenir la référence de l'objet décoré (généralement par le biais du constructeur) alors que Proxy responsable de faire ça tout seul.

Proxy peut ne pas instancier du tout l'objet enveloppant (comme cela se fait dans les ORM pour éviter un accès inutile à la base de données si les champs/getters de l'objet ne sont pas utilisés) alors que Décorateur contient toujours un lien vers l'instance réelle enveloppée.

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

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

29voto

Ravindra babu Points 5571

Principales différences :

  1. Proxy fournit la même interface. Décorateur fournit une interface améliorée.
  2. Décorateur y Proxy ont des objectifs différents mais des structures similaires. Tous 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 les demandes.
  3. Décorateur peut être considérée comme une Composite dégénérée avec une seule composante. Cependant, un décorateur ajoute des responsabilités supplémentaires - il n'est pas destiné à l'agrégation d'objets.
  4. Décorateur supporte la récurrence composition
  5. El Décorateur déclare une classe composition à l'interface LCD (Lowest Class Denominator), et ce membre de données est initialisé dans son constructeur.
  6. Utilisez Proxy pour l'initialisation paresseuse, l'amélioration des performances par la mise en cache de l'objet et l'amélioration de la qualité du service. contrôler l'accès au client/appelant

Fabrication à la source L'article cite les similitudes et les différences de manière excellente.

Questions/liens SE connexes :

Quand utiliser le motif décorateur ?

Quelle est la différence exacte entre les modèles Adapter et Proxy ?

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