Différence entre le modèle Adaptateur et le modèle Proxy?

33

Pour ce qui est de comprendre, le modèle d'adaptateur crée un objet wrapper pour notre objet d'intérêt réel, simplement un niveau supplémentaire d'indirection, ce qui offre une flexibilité. la flexibilité réside dans le fait que, si l'interface de l'objet réel est modifiée, nous modifions l'interface de wrapper pointant vers l'objet réel, laissant l'interface exposée côté client inchangée.

Le modèle de proxy est le même, à la différence que chaque wrapper de proxy ne fournit qu'un sous-ensemble cohérent de la fonctionnalité de l'objet réel. Pourquoi cela serait-il utile alors que nous nous efforçons de créer "une classe pour un seul but" me dépasse.

Ai-je bien compris?

Vorac
la source

Réponses:

55

Pas entièrement.

L'objectif principal du modèle d'adaptateur est de modifier l'interface de la classe / bibliothèque A par les attentes du client B. L'implémentation typique est une classe wrapper ou un ensemble de classes. Le but n'est pas de faciliter les modifications futures d'interface, mais les incompatibilités d'interface actuelles.

Le modèle de proxy utilise également des classes wrapper, mais dans un but différent. Le modèle de proxy a pour but de créer un remplaçant pour une ressource réelle. Les raisons d'utiliser un proxy peuvent être

  • La ressource réelle réside sur un ordinateur distant (le proxy facilite l’interaction avec la ressource distante)
  • La ressource réelle est coûteuse à créer (le proxy veille à ce que le coût ne soit pas engagé sauf si / jusqu'à ce qu'il soit réellement nécessaire)

La chose la plus importante est qu’un proxy fournisse une substitution immédiate de la ressource réelle pour laquelle il se substitue, il doit donc fournir la même interface.

Bart van Ingen Schenau
la source
Tout d'abord, merci pour la bonne réponse. Un proxy implémente-t-il toutes les interfaces dont le client actuel a besoin ou implémente-t-il toutes les interfaces fournies par la ressource réelle?
Vorac
1
@Vorac: Cela dépend de la complexité de l'interface et de votre philosophie de conception. Les deux sont possibles, mais si l'interface est grande / complexe ou si vous croyez fermement en YAGNI, il est alors plus logique de mettre en œuvre uniquement ce dont vous avez besoin.
Bart van Ingen Schenau
Donc, étant donné que le modèle Adapter utilise des classes wrapper, le modèle Adaptateur est-il un modèle proxy?
moonman239
@ moonman239: Non, car l'intention d'utiliser une classe de wrapper est différente. Le fait que deux modèles se ressemblent dans un diagramme de classes ne signifie pas qu’ils sont liés ou s’implémentent. Un des principaux facteurs de différenciation des modèles est leur intention.
Bart van Ingen Schenau