Quelqu'un at-il déjà utilisé le modèle de pont dans une application du monde réel? Si oui, comment l'avez-vous utilisé? Est-ce moi, ou est-ce juste le modèle d'adaptateur avec une petite injection de dépendance jetée dans le mélange? Mérite-t-il vraiment son propre modèle?
design-patterns
adapter
bridge
Charles Graham
la source
la source
Réponses:
Un exemple classique du modèle de pont est utilisé dans la définition de formes dans un environnement d'interface utilisateur (voir l'entrée Wikipedia du modèle de pont ). Le modèle Bridge est un composite des modèles de modèle et de stratégie .
Il s'agit d'une vue commune de certains aspects du modèle d'adaptateur dans le modèle de pont. Cependant, pour citer cet article :
la source
Il y a une combinaison des réponses de Federico et de John .
Quand:
Refactoriser en:
la source
Le modèle Bridge est une application du vieux conseil, "préférez la composition à l'héritage". Cela devient pratique lorsque vous devez sous-classer différents moments de manière orthogonale les uns par rapport aux autres. Disons que vous devez implémenter une hiérarchie de formes colorées. Vous ne sous-classeriez pas Shape avec Rectangle et Circle, puis sous-classeriez Rectangle avec RedRectangle, BlueRectangle et GreenRectangle et la même chose pour Circle, n'est-ce pas? Vous préféreriez dire que chaque forme a une couleur et implémenter une hiérarchie de couleurs, et c'est le modèle de pont. Eh bien, je n'implémenterais pas une "hiérarchie de couleurs", mais vous voyez l'idée ...
la source
Quand:
Refactoriser en:
la source
L'adaptateur et le pont sont certainement liés, et la distinction est subtile. Il est probable que certaines personnes qui pensent utiliser l'un de ces modèles utilisent en fait l'autre modèle.
L'explication que j'ai vue est que Adapter est utilisé lorsque vous essayez d'unifier les interfaces de certaines classes incompatibles qui existent déjà . L'adaptateur fonctionne comme une sorte de traducteur d'implémentations qui pourraient être considérées comme héritées .
Alors que le modèle Bridge est utilisé pour le code qui est plus susceptible d'être greenfield. Vous concevez le Bridge pour fournir une interface abstraite pour une implémentation qui doit varier, mais vous définissez également l'interface de ces classes d'implémentation.
Les pilotes de périphériques sont un exemple souvent cité de Bridge, mais je dirais que c'est un Bridge si vous définissez la spécification d'interface pour les fournisseurs de périphériques, mais c'est un adaptateur si vous prenez des pilotes de périphérique existants et créez une classe wrapper pour fournir une interface unifiée.
Donc, au niveau du code, les deux modèles sont très similaires. Sur le plan commercial, ils sont différents.
Voir aussi http://c2.com/cgi/wiki?BridgePattern
la source
D'après mon expérience, Bridge est un modèle assez souvent récurrent, car c'est la solution chaque fois qu'il y a deux dimensions orthogonales dans le domaine . Par exemple, les formes et les méthodes de dessin, les comportements et les plates-formes, les formats de fichiers et les sérialiseurs, etc.
Et un conseil: pensez toujours aux modèles de conception du point de vue conceptuel , pas du point de vue de la mise en œuvre. Du bon point de vue, Bridge ne peut pas être confondu avec Adapter, car ils résolvent un problème différent, et la composition est supérieure à l'héritage non pas à cause d'elle-même, mais parce qu'elle permet de traiter séparément les problèmes orthogonaux.
la source
L'intention de Bridge et Adapter est différente et nous avons besoin des deux modèles séparément.
Modèle de pont:
Utilisez le modèle Bridge lorsque:
@ La réponse de John Sonmez montre clairement l'efficacité du modèle de pont pour réduire la hiérarchie des classes.
Vous pouvez vous référer au lien de documentation ci-dessous pour obtenir un meilleur aperçu du modèle de pont avec un exemple de code
Modèle d'adaptateur :
Principales différences:
Question SE associée avec diagramme UML et code de travail:
Différence entre le modèle de pont et le modèle d'adaptateur
Articles utiles:
article de modèle de pont de sourcemaking
article de modèle d' adaptateur de sourcemaking
article de modèle de pont journaldev
ÉDITER:
Exemple de modèle de pont réel (selon la suggestion de meta.stackoverflow.com, exemple de site de documentation incorporé dans cet article puisque la documentation va se coucher)
Le modèle de pont dissocie l'abstraction de l'implémentation afin que les deux puissent varier indépendamment. Il a été réalisé avec la composition plutôt que l'héritage.
Modèle de pont UML de Wikipedia:
Vous avez quatre composants dans ce modèle.
Abstraction
: Il définit une interfaceRefinedAbstraction
: Il implémente l'abstraction:Implementor
: Il définit une interface pour l'implémentationConcreteImplementor
: Il implémente l'interface de l'implémenteur.The crux of Bridge pattern :
Deux hiérarchies de classes orthogonales utilisant la composition (et pas d'héritage). La hiérarchie d'abstraction et la hiérarchie d'implémentation peuvent varier indépendamment. La mise en œuvre ne fait jamais référence à l'abstraction. Abstraction contient une interface d'implémentation en tant que membre (via la composition). Cette composition réduit un niveau supplémentaire de hiérarchie d'héritage.Cas d'utilisation de mots réels:
Permettez à différents véhicules d'avoir les deux versions de système de vitesse manuel et automatique.
Exemple de code:
production:
Explication:
Vehicle
est une abstraction.Car
etTruck
sont deux implémentations concrètes deVehicle
.Vehicle
définit une méthode abstraite:addGear()
.Gear
est l'interface de l'implémenteurManualGear
etAutoGear
sont deux implémentations deGear
Vehicle
contient l'implementor
interface plutôt que l'implémentation de l'interface.Compositon
de l'interface de l'implémenteur est au cœur de ce modèle: il permet à l'abstraction et à l'implémentation de varier indépendamment.Car
etTruck
définir l'implémentation (abstraction redéfinie) pour l'abstractionaddGear()
:: Elle contientGear
- SoitManual
soitAuto
Cas d'utilisation du modèle Bridge :
la source
J'ai utilisé le modèle de pont au travail. Je programme en C ++, où il est souvent appelé l'idiome PIMPL (pointeur vers l'implémentation). Cela ressemble à ceci:
Dans cet exemple,
class A
contient l'interface etclass Aimpl
contient l'implémentation.Une utilisation de ce modèle consiste à exposer uniquement certains des membres publics de la classe d'implémentation, mais pas d'autres. Dans l'exemple, seul
Aimpl::foo()
peut être appelé via l'interface publique deA
, mais pasAimpl::bar()
Un autre avantage est que vous pouvez définir
Aimpl
dans un fichier d'en-tête séparé qui n'a pas besoin d'être inclus par les utilisateurs deA
. Tout ce que vous avez à faire est d'utiliser une déclarationAimpl
avant deA
définir avant et de déplacer les définitions de toutes les fonctions membres référençantpImpl
dans le fichier .cpp. Cela vous permet de garder l'en-Aimpl
tête privé et de réduire le temps de compilation.la source
Pour mettre un exemple de forme dans le code:
La sortie est:
Notez la facilité avec laquelle de nouvelles couleurs et formes peuvent être ajoutées au système sans conduire à une explosion des sous-classes en raison des permutations.
la source
pour moi, je pense que c'est un mécanisme où vous pouvez échanger des interfaces. Dans le monde réel, vous pourriez avoir une classe qui peut utiliser plus d'une interface, Bridge vous permet d'échanger.
la source
Vous travaillez pour une compagnie d'assurance où vous développez une application de workflow qui gère différents types de tâches: comptabilité, contrat, sinistres. C'est l'abstraction. Côté implémentation, vous devez être capable de créer des tâches à partir de différentes sources: email, fax, e-messagerie.
Vous commencez votre conception avec ces classes:
Désormais, chaque source devant être gérée de manière spécifique, vous décidez de spécialiser chaque type de tâche:
Vous vous retrouvez avec 13 cours. L'ajout d'un type de tâche ou d'un type source devient difficile. L'utilisation du modèle de pont produit quelque chose de plus facile à maintenir en découplant la tâche (l'abstraction) de la source (ce qui est un problème d'implémentation):
L'ajout d'un type de tâche ou d'une source est désormais beaucoup plus simple.
Remarque: la plupart des développeurs ne créeraient pas la hiérarchie des 13 classes à l'avance pour gérer ce problème. Cependant, dans la vraie vie, vous ne connaissez peut-être pas à l'avance le nombre de types de sources et de tâches; si vous n'avez qu'une seule source et deux types de tâches, vous ne dissocierez probablement pas la tâche de la source. Ensuite, la complexité globale augmente à mesure que de nouvelles sources et types de tâches sont ajoutés. À un moment donné, vous refactoriserez et, le plus souvent, vous vous retrouverez avec une solution de type pont.
la source
la source