Comment faire de la Proxy, de Décorateur, de l'Adaptateur, et le Pont Modèles diffèrent?
Je regardais le Modèle de Proxy, et pour moi, il semble beaucoup comme le Décorateur, de l'Adaptateur, et le Pont de motifs. Suis-je un malentendu quelque chose? Quelle est la différence? Pourquoi voudrais-je utiliser le modèle de Proxy contre les autres? Comment avez-vous utilisé dans le passé dans le monde réel des projets?
- Il y a souvent des modèles qui ont l'air très similaire, mais diffèrent dans leur intention (la stratégie et de l'état des modèles viennent à l'esprit). Je pense que cela est souvent dû au fait que les modèles de conception sont basées sur la commune de solides principes de design.
- Eh bien, ces quatre modèles ont exactement les mêmes détails de mise en œuvre. État des versets de la Stratégie peut au moins se résumer comme état " des versets apatrides (pour la plupart). Souvent, la Stratégie est simplement de la méthode d'injection, où l'état modèle utilise une interface à ne plus abstrait d'un appel de méthode. La stratégie, aussi, à la fin de la journée, c'est un hack pour permettre la programmation fonctionnelle dans le monde orienté objet.
- pourriez-vous ÊTRE plus claire ? 😛
Vous devez vous connecter pour publier un commentaire.
Proxy, de Décorateur, de l'Adaptateur, et le Pont sont toutes des variations sur "l'habillage" d'une classe. Mais leurs usages sont différents.
Proxy peut être utilisé lorsque vous voulez paresseux-instancier un objet, ou de cacher le fait que vous appelez un service à distance, ou le contrôle de l'accès à l'objet.
Décorateur est également appelée "Smart Proxy". Il est utilisé lorsque vous voulez ajouter des fonctionnalités à un objet, mais pas par l'extension de l'objet de type. Cela vous permet de le faire au moment de l'exécution.
Adaptateur est utilisé lorsque vous avez une interface abstraite, et que vous voulez la carte d'interface à un autre objet qui a le même rôle fonctionnel, mais d'une autre interface.
Pont est très similaire à la Carte, mais nous l'appelons Pont lorsque vous définissez à la fois abstraite de l'interface et de l'implémentation sous-jacente. I. e. vous n'êtes pas à s'adapter à certaines de legs ou de code tiers, vous êtes le concepteur de tout le code, mais vous devez être en mesure d'échanger les différentes implémentations.
Façade est d'un niveau supérieur (lire: plus simple) de l'interface à un sous-système d'un ou de plusieurs classes. Supposons que vous avez un concept complexe qui nécessite plusieurs objets à représenter. Apporter des modifications à cet ensemble d'objets est de la confusion, car on ne sait pas toujours quel est l'objet qui a la méthode que vous devez appeler. C'est le temps d'écrire une Façade qui fournit des méthodes pour toutes les opérations complexes que vous pouvez faire pour la collection d'objets. Exemple: un Modèle de Domaine pour une école de section, avec des méthodes comme
countStudents()
,reportAttendance()
,assignSubstituteTeacher()
, et ainsi de suite.Comme le projet de Loi de réponse dit, leurs cas d'utilisation sont différentes.
Leurs structures.
Proxy et Décorateur les deux ont la même interface que leur enveloppé types, mais le proxy crée une instance sous le capot, tandis que le décorateur prend un exemple dans le constructeur.
Adaptateur et Façade les deux ont une interface différente de ce qu'elles enveloppent. Mais la carte provient d'une interface existante, tandis que la façade crée une nouvelle interface.
Pont et Adaptateur à la fois à un type existant. Mais le pont point à un type abstrait, et l'adaptateur peut pointer vers un type de béton. Le pont vous permettra de coupler la mise en œuvre au moment de l'exécution, tandis que l'adaptateur n'est pas souvent.
Mon point de vue sur le sujet.
Tous les quatre modèles ont beaucoup en commun, tous les quatre sont parfois officieusement appelé wrappers, ou wrapper modèles. Toute utilisation de la composition, de conditionnement, l'objet et la délégation de l'exécution de l'objet à un certain point, faire le mappage d'un appel de méthode à une autre. Ils rechange client de la nécessité d'avoir à construire un objet différent et copier toutes les données pertinentes. Si utilisé à bon escient, ils économiser de la mémoire et du processeur.
Par la promotion de couplage lâche qu'ils font une fois de code stable moins exposés à des changements inévitables et mieux lisible pour les autres développeurs.
Adaptateur
Adaptateur s'adapte à l'objet (objet) à une interface différente. De cette façon, nous pouvons ajouter un objet placé à une collection de nominalement différents types.
Adaptateur d'exposer uniquement les méthodes pertinentes pour les clients, peuvent restreindre tous les autres, révélant les intentions d'utilisation pour des contextes particuliers, comme l'adaptation de bibliothèque externe, faire apparaître moins générales et plus axée sur nos besoins de l'application. Cartes d'accroître la lisibilité et l'auto-description de notre code.
Adaptateurs de boucliers d'une équipe de la volatilité du code à partir d'autres équipes; un sauveur de vie de l'outil lorsqu'ils traitent avec des équipes offshore 😉
Moins de but mentionné à éviter le sujet de la classe de l'excès d'annotations. Avec autant de cadres basé sur les annotations cela devient de plus en plus important de l'utilisation que jamais.
Adaptateur permet d'obtenir autour de Java limitation de seulement de l'héritage simple. Il est possible de combiner plusieurs adaptees sous une enveloppe donnant l'impression d'avoir de l'héritage multiple.
Code sage, l'Adaptateur est “mince”. Il ne faut pas ajouter trop de code pour les objets de la classe, en plus de simplement s'adapte à l'appel de la méthode et des données de conversions nécessaires pour faire de tels appels.
Il n'y a pas beaucoup de bonnes adaptateur exemples dans le JDK ou bibliothèques de base. Les développeurs d'applications de créer des Cartes, d'adapter les bibliothèques de l'application des interfaces spécifiques.
Décorateur
Décorateur non seulement délégué, non seulement des cartes d'une méthode à l'autre, ils le font plus, ils modifient le comportement de certains sous réserve des méthodes, il peut décider de ne pas l'appel de méthode à tous, déléguer à un autre objet, un objet d'assistance.
Décorateurs généralement ajouter (de manière transparente) des fonctionnalités pour objet enveloppé comme l'exploitation forestière, de chiffrement, de formatage, de la compression ou de l'objet. Cette Nouvelle fonctionnalité peut apporter beaucoup de nouveau code. Par conséquent, les décorateurs sont habituellement beaucoup de “gros”, alors les Cartes.
Décorateur doit être une sous-classe de l'objet de l'interface. Ils peuvent être utilisés de manière transparente à la place de ses sujets. Voir BufferedOutputStream, il est encore OutputStream et peut être utilisé en tant que tel. C'est une technique majeure de différence à partir de Cartes.
Texte livre des exemples de l'ensemble des décorateurs de la famille est facilement dans le JDK - Java IO. Toutes les classes comme BufferedOutputStream, FilterOutputStream et ObjectOutputStream sont des décorateurs d' OutputStream. Ils peuvent être l'oignon en couches, où un décorateur est décoré de nouveau, en ajoutant plus de fonctionnalités.
Proxy
Proxy n'est pas typique d'un wrapper. L'objet enveloppé, le proxy de l'objet, peut ne pas encore exister au moment de la création de proxy. Proxy crée souvent en interne. Il peut être un objet lourd, créé à la demande, ou qu'il est à distance de l'objet dans les différentes JVM ou différents noeuds du réseau et même un non-objet Java, un élément en code natif. Il n'est pas nécessaire d'envelopper ou le déléguer à un autre objet.
La plupart des exemples typiques sont à distance de procurations, lourde les initialiseurs d'objets et l'accès aux procurations.
Proxy distant – sujet est sur le serveur distant, différentes JVM ou même non
Système Java. Proxy se traduit par des appels à la méthode de RMI/REST/SOAP appels ou
tout ce qui est nécessaire, le blindage client de l'exposition au sous-jacent
de la technologie.
Lazy Load Proxy – entièrement initialiser l'objet qu'à la première utilisation ou
première utilisation intensive.
Proxy d'accès – contrôle de l'accès à l'objet.
Façade
Façade est étroitement associé avec le Principe de conception de la Connaissance au Moins (Loi de Déméter).
La façade est très similaire à la Carte. Ils ont tous les deux envelopper, ils ont tous deux la carte un objet à l'autre, mais ils diffèrent dans l'intention. Façade aplatit la complexité de la structure d'un sujet, d'objet complexe graphique, la simplification de l'accès à une structure complexe.
Façade enveloppe une structure complexe, en fournissant une plate interface. Cela empêche client de l'objet est exposé à des relations internes au sujet de la structure donc la promotion de couplage lâche.
Pont
Variante plus complexe de l'Adaptateur, où non seulement la mise en œuvre varie, mais aussi l'abstraction. Il ajoute encore une indirection à la délégation. Le supplément de délégation est le pont. Il dissocie l'Adaptateur de même de l'adaptation de l'interface. Il augmente la complexité plus que tout autre de l'autre habillage de motifs, de sorte s'appliquent avec soin.
Différences dans les constructeurs
Modèle différences sont également évident lorsque l'on regarde leurs constructeurs.
Proxy n'est pas l'enchaînement d'un objet existant. Il n'y a aucun objet dans le constructeur.
Décorateur et Adaptateur emballez déjà existante de l'objet, et est généralement
fourni dans le constructeur.
Façade constructeur prend de l'élément racine de l'ensemble de l'objet graphique, sinon, il semble
de même que l'Adaptateur.
Exemple réel – JAXB de l'Ordonnancement de l'Adaptateur. Le but de cette carte est la cartographie d'un simple plat de classe à structure plus complexe nécessaire à l'externe et à l'empêcher de "polluer" le sujet de la classe excessive d'annotations.
Il y a beaucoup de chevauchement dans de nombreux patterns GoF. Elles sont toutes construites sur le pouvoir de polymorphisme et parfois seulement sont vraiment différents dans l'intention. (stratégie contre l'état)
Ma compréhension des modèles augmenté de 100 fois après la lecture de La Tête La Première, Les Modèles De Conception.
Je le recommande fortement!
Toutes les bonnes réponses d'experts ont déjà expliqué ce que fait chaque modèle est pour.
Je vais décorer points clés.
Décorateur:
par exemple (avec chaînage ) :
java.io
package de classes liées à laInputStream
&OutputStream
interfacesProxy:
par exemple:
java.rmi
les classes du package.Adaptateur:
par exemple
java.io.InputStreamReader
(InputStream
renvoie uneReader
)Pont:
par exemple, la Collecte des classes dans
java.util
.List
mis en œuvre parArrayList
.Notes principales:
Ont un coup d'oeil à de grands SE questions/articles concernant des exemples de divers modèles de conception
Quand Utiliser le Pattern Décorateur?
Lorsque vous utilisez le Pont de Modèle? Comment est-il différent de l'Adaptateur?
Les différences entre le Proxy et le Décorateur Modèle
Ils sont assez similaires, et les lignes entre eux sont tout à fait gris. Je vous suggère de lire le Modèle De Proxy et Décorateur Modèle entrées dans la c2 wiki.
Les entrées et les discussions y sont assez vastes, et ils ont aussi un lien vers d'autres articles. Par ailleurs, la c2 wiki est excellente si vous demandez sur les nuances entre les différents modèles.
À la somme de la c2 entrées, je dirais un décorateur ajoute/modifie le comportement, mais un proxy a plus à voir avec le contrôle d'accès (instanciation paresseuse, accès à distance, la sécurité, etc). Mais comme je l'ai dit, les lignes entre eux sont gris, et je vois des références à des proxys qui pourrait facilement être considéré comme décorateurs et vice versa.
Cette citation de
La Tête La Première, Les Modèles De Conception
Définitions appartient à réserver. Exemples m'appartient.
Décorateur - Ne pas modifier l'interface, mais ajoute de la responsabilité. Supposons que vous disposez d'une interface de voiture,
lorsque vous implémentez ce pour différents modèle de la voiture (s, sv, sl) vous devrez peut-être ajouter plus de responsabilité pour certains modèles. Comme l'a toit ouvrant, airbag, etc..
Adaptateur - Convertit une interface à une autre. Vous disposez d'une interface de voiture et que vous souhaitez pour agir comme jeep. Si vous prenez la voiture, de modifier et de le transformer dans une jeep. Car il n'est pas un vrai jeep. Mais agit comme une jeep.
Façade - Fait-une interface plus simple. Supposons que vous disposez de voiture, avion, bateau interfaces. En fait, tous vous avez besoin est une classe qui envoie des gens d'un endroit à un autre. Vous souhaitez façade de décider de ce véhicule à l'utilisation. Ensuite, vous recueillir toutes ces interface références sous 1 parapluie et le laisser décider/délégué pour garder les choses simples.
La tête la Première: "Une façade simplifie non seulement une interface, il dissocie d'un client à partir d'un sous-système
de composants.
Les façades et les adaptateurs peuvent envelopper plusieurs classes, mais une façade le but est de simplifier, tout en
un adaptateur est de convertir l'interface à quelque chose de différent."
Tous les quatre impliquent habillage intérieur de l'objet/classe avec l'extérieur, de sorte qu'ils sont très semblables du point de vue structurel. Je voudrais indiquer la différence par le but à atteindre:
Et par l'interface de variation entre l'intérieur et l'extérieur des objets:
Je l'utilise assez souvent, lorsque la consommation de services web. Le Modèle de Proxy doit probablement être renommé à quelque chose de plus pragmatique, comme le "Wrapper Motif". J'ai aussi une bibliothèque qui est un Proxy vers MS Excel. Il le rend très facile à automatiser Excel, sans avoir à se soucier des détails d'arrière-plan tels que quelle version est installée (le cas échéant).
Parler en détail de la mise en œuvre, je trouve une différence entre un Proxy et un Décorateur, d'un Adaptateur de Façade ... En commun de mise en œuvre de ces modèles, il y a un objet cible enveloppé par un englobante de l'objet. Client utilise englobante de l'objet au lieu de l'objet cible. Et l'objet cible jouent de fait un rôle important à l'intérieur de certaines des méthodes de protection d'objet.
Toutefois, en cas de Procuration, en joignant objet peut jouer certaines méthodes par lui-même, il vient d'initialiser l'objet cible lorsque le client appelle certaines méthodes qu'il a besoin de l'objet cible participer. C'est l'initialisation tardive. Dans le cas d'autres modèles, en joignant objet est pratiquement basé sur l'objet cible. Si l'objet cible est toujours initialisée avec englobante de l'objet dans les constructeurs/setters.
Autre chose, un proxy est exactement ce qu'une cible ne alors que d'autres modèles d'ajouter de nouvelles fonctionnalités à la cible.
Je tiens à ajouter des exemples de projet de Loi Karwing réponse (qui est grand btw.)
J'ajoute aussi quelques différences clés de la mise en œuvre, que je ressens sont manquants
Cité pièces de réponse de [https://stackoverflow.com/a/350471/1984346%5D (projet de Loi Karwing)
ProxyClass et ObjectClass qui est mandaté, doit implémenter la même interface, de sorte qu'ils sont interchangeables
Exemple - proxy cher objet
DecoratorClass doit(peut) mettre en œuvre les interfaces étendues de ObjectClass. Si l'ObjectClass pourrait être remplacé par DecoratorClass, mais pas vice-versa.
Exemple en ajoutant plus de fonctionnalités
Implentation des différences Proxy, Décorateur, Adaptateur
Adaptateur fournit une interface différente à son sujet. Proxy fournit la même interface. Décorateur fournit une interface améliorée.
Plupart des informations contenues dans cette réponse, c'est à partir de https://sourcemaking.com/design_patterns, que je recommande comme un excellente ressource pour les modèles de conception.
Je crois que le code va donner une claire idées (à compléter d'autres réponses que de bien). Veuillez voir ci-dessous, (Focus les types qu'une classe implémente et enveloppe)
Modèle de conception n'est pas des mathématiques, c'est une combinaison de l'art et de génie logiciel. Il n'y a rien de semblable à cette exigence, vous devez utiliser un proxy, pont etc. Les Design patterns sont créés pour résoudre les problèmes. Si vous prévoyez un problème de conception, puis l'utiliser. Basé sur l'expérience, vous arriverez à connaître de problème spécifique, dont le motif à utiliser. Si vous êtes bon dans de solides principes de design, vous ont mis en œuvre des schémas de conception, et sans le savoir est une habitude. Exemple courant est statergy et à l'usine de modèles
Donc se concentrer plus sur de solides desighn principes, nettoyer les principes du codage et de ttd