Quelle est la différence entre les modèles de conception Façade, Proxy, Adaptateur et Décorateur?
Je n'ai jamais lu d'explication claire, quelle est la vôtre?
Quelle est la différence entre les modèles de conception Façade, Proxy, Adaptateur et Décorateur?
Je n'ai jamais lu d'explication claire, quelle est la vôtre?
Réponses:
L'adaptateur adapte une classe / un objet donné à une nouvelle interface. Dans le premier cas, l'héritage multiple est généralement utilisé. Dans ce dernier cas, l'objet est enveloppé par un objet adaptateur conforme et transmis. Le problème que nous résolvons ici est celui des interfaces non compatibles .
La façade ressemble plus à une simple passerelle vers un ensemble complexe de fonctionnalités. Vous créez une boîte noire pour que vos clients s'inquiètent moins, c'est-à-dire simplifient les interfaces .
Proxy fournit la même interface que la classe proxied-for et s'occupe généralement de certaines tâches administratives. (Donc, au lieu de faire plusieurs copies d'un objet lourd, X
vous faites des copies d'un proxy léger P
qui à son tour gère X
et traduit vos appels selon les besoins.) Vous résolvez le problème du client d'avoir à gérer un objet lourd et / ou complexe .
Decorator est utilisé pour ajouter plus de poudre à canon à vos objets (notez le terme objets - vous décorez généralement les objets de manière dynamique au moment de l'exécution). Vous ne masquez pas / n'altérez pas les interfaces existantes de l'objet, mais vous l' étendez simplement lors de l'exécution .
Maintenant que vous avez un décorateur impliqué, vous voudrez probablement savoir pourquoi l'accent mis sur le mot objet - certains langages (comme Java) ne permettent tout simplement pas l'héritage virtuel (c'est-à-dire l'héritage multiple comme le fait C ++) pour vous permettre d'accomplir cela à temps de compilation.
Depuis que nous avons traîné dans plusieurs héritages (et le diamant redouté), vous rechercherez des mixins - qui sont un chaînage linéaire ordonné des interfaces pour contourner les problèmes d'héritage multiple. Cependant, les mixins ne se mélangent pas très bien. Et nous nous retrouvons avec des traits - oui, ces petites taches de comportement sans état que vous voyez apparaître tout le temps dans les paramètres de modèle en C ++. Les traits tentent d'aborder les problèmes de composition et de décomposition du comportement de manière élégante sans aller ni pour les héritages multiples ni pour le chaînage ordonné.
Façade
Vous pouvez utiliser une façade, par exemple, pour faciliter les appels à une API. Jetez un œil à cet exemple de façade éloignée. L'idée ici est que l'implémentation complète du code sur le serveur est cachée au client. Le client appelle 1 méthode API qui, à son tour, peut effectuer 1 ou plusieurs appels API sur le serveur.
Adaptateur
Un bon exemple de ceci peut être trouvé ici , sur Wikipedia. Un objet client Source
aimerait appeler une méthode sur un autre objet Target
, mais l'interface de cet autre objet diffère de ce que le client attend.
Entrez l'objet adaptateur.
Il peut prendre un appel de l' Source
objet et, dans les coulisses, appeler la Target
méthode qui doit être utilisée.
Source->CallMethodAOnTarget() ---< Adaptor.CallMethodAOnTarget() this calls ---> Target.MethodWithDifferentSignatureAndName(int i)
Quant à Proxy, je n'ai aucune expérience de ce modèle de conception.