Différence entre le dessin de pont et le dessin D'Adaptateur
6 réponses
" L'Adaptateur fait fonctionner les choses une fois qu'elles sont conçues; Le Pont les fait fonctionner avant qu'elles ne le soient. [GoF, p219]"
effectivement, le modèle D'adaptateur est utile lorsque vous avez du code existant, que ce soit un tiers, ou en interne, mais hors de votre contrôle, ou autrement non modifiable pour répondre tout à fait à l'interface dont vous avez besoin. Par exemple, nous avons un SuperWeaponsArray qui peut contrôler un tableau fin des dispositifs de jugement dernier.
public class SuperWeaponsArray {
/*...*/
public void destroyWorld() {
for (Weapon w : armedWeapons) {
w.fire();
}
}
}
Super. Sauf que nous réalisons que nous avons un dispositif nucléaire dans notre arsenal qui précède largement la conversion à l'interface D'armes. Mais nous aimerions vraiment que cela fonctionne ici... donc, ce que nous faisons... wedge!
Arme NukeWeaponsAdaptor-basée à partir de notre classe D'arme nucléaire, mais l'exportation de l'interface D'Arme. Doux, maintenant, nous pouvons sûrement détruire le monde. Il semble que peu de bidouille, mais ça rend les choses fonctionnent.
le dessin du pont est quelque chose vous implémentez d'abord - si vous savez que vous avez deux hiérarchies orthogonales, cela fournit un moyen de découpler l'interface et l'implémentation de telle sorte que vous n'obtenez pas un nombre insensé de classes. Disons que vous avez:
MemoryMappedFile et DirectReadFile types de fichiers objets. Disons que vous voulez être capable de lire des fichiers à partir de différentes sources (peut-être Linux vs. implémentations Windows, etc.). Bridge vous aide à éviter de remonter avec:
MemoryMappedWindowsFile MemoryMappedLinuxFile DirectReadWindowsFile DirectReadLinuxFile
http://en.wikipedia.org/wiki/Adapter_pattern
le motif de L'adaptateur est plus sur le fait de faire fonctionner votre code existant avec un système ou une interface plus récente.
si vous avez un ensemble d'API de service Web standard de l'entreprise que vous souhaitez offrir à l'interface d'extensibilité existante d'une autre application, vous pourriez envisager d'écrire un ensemble d'adaptateurs pour le faire. Noter qu'il y a une zone grise, et c'est plus sur la façon dont vous techniquement définir le modèle, puisque d'autres modèles comme la façade sont similaires.
http://en.wikipedia.org/wiki/Bridge_pattern
le modèle de pont va vous permettre d'avoir éventuellement des implémentations alternatives d'un algorithme ou d'un système.
bien que ce ne soit pas un exemple classique de Pont, imaginez si vous aviez quelques implémentations d'un data store: l'une est efficace dans l'espace, l'autre est efficace dans la performance brute... et vous avez une analyse de rentabilisation pour offrir les deux dans votre application ou cadre.
en termes de votre question, "Où je peux utiliser quel modèle," la réponse est, partout où cela a du sens pour votre projet! Peut-être envisager d'offrir une clarification modifier pour guider la discussion sur l'endroit où vous croyez que vous avez besoin d'utiliser l'un ou l'autre.
Ce post a été autour pendant un bon moment. Cependant, il est important de comprendre qu'une façade est un peu similaire à un adaptateur, mais ce n'est pas tout à fait la même chose. Un adaptateur "adapte" une classe existante à une classe client habituellement non compatible. Disons que vous avez un vieux système de flux de travail que votre application utilise en tant que client. Votre société pourrait éventuellement remplacer le système de flux de travail avec un nouveau "incompatible" (en termes d'interfaces). Dans la plupart des cas, vous pourriez utiliser le adapter le modèle et écrire du code qui appelle en fait les interfaces du nouveau moteur de flux de travail. Un pont est généralement utilisé d'une manière différente. Si vous avez réellement un système qui doit fonctionner avec différents systèmes de fichiers (par exemple disque local, NFS, etc. vous pouvez utiliser le modèle de pont et créer une couche d'abstraction pour travailler avec tous vos systèmes de fichiers. Ce serait essentiellement un cas d'utilisation simple pour le modèle de pont. La façade et l'adaptateur partagent certaines propriétés mais les façades sont généralement utilisé pour simplifier une interface/classe existante . Au début des EJBs, il n'y avait pas d'appels locaux pour les EJBs. Les développeurs obtenaient toujours le talon, le réduisaient et l'appelaient "pseudo-À Distance". Cette situation a souvent causé des problèmes de rendement (en particulier: quand vraiment appelé sur le fil). Les développeurs expérimentés utiliseraient le motif de façade pour fournir une interface à grain très grossier au client. Cette façade ferait alors à son tour plusieurs appels à différentes méthodes plus fines. Tout dans l'ensemble, cela a permis de réduire considérablement le nombre d'appels de méthodes requis et d'augmenter la performance.
Adaptateur:
- Elle est un modèle structurel
- Il est utile de travailler avec deux interfaces incompatibles
UML: from dofactory article:
cible : définit l'interface spécifique au domaine que le Client utilise.
Adaptateur : adapte l'interface adaptée à l'interface cible.
Objet : définit une interface existante qui doit s'adapter.
Client : collabore avec des objets conformes l'interface cible.
exemple:
carré et Rectangle sont deux formes différentes et obtenir la surface () de chacun d'eux nécessite des méthodes différentes. Mais encore le travail carré sur L'interface de Rectangle avec la conversion de certaines des propriétés.
public class AdapterDemo{
public static void main(String args[]){
SquareArea s = new SquareArea(4);
System.out.println("Square area :"+s.getArea());
}
}
class RectangleArea {
public int getArea(int length, int width){
return length * width;
}
}
class SquareArea extends RectangleArea {
int length;
public SquareArea(int length){
this.length = length;
}
public int getArea(){
return getArea(length,length);
}
}
Pont:
- C'est modèle structurel
- il découple une abstraction de sa mise en œuvre et peuvent varier de manière indépendante
- c'est possible parce que la composition a été utilisée à la place de l'héritage
EDIT: (selon la suggestion de @quasoft)
vous avez quatre composants dans ce modèle.
-
Abstraction : il définit une interface
-
RefinedAbstraction : il implémente l'abstraction:
-
Implementor : il définit une interface pour la mise en œuvre
-
ConcreteImplementor : il implémente L'interface Implementor.
Gear gear = new ManualGear();
Vehicle vehicle = new Car(gear);
vehicle.addGear();
gear = new AutoGear();
vehicle = new Car(gear);
vehicle.addGear();
Related post:
Quand utilisez-vous le modèle de Pont? En quoi est-il différent du modèle adaptateur?
principales différences: à partir de sourcemaking article
- L'Adaptateur fait fonctionner les choses après leur conception; le pont les fait fonctionner avant qu'elles ne le soient.
- pont est conçu à l'avant pour laisser l'abstraction et le la mise en œuvre varie de façon indépendante. Adaptateur est modifié pour faire fonctionner ensemble des classes non liées.
supposons que vous ayez une classe de forme abstraite avec une fonctionnalité de dessin (Générique / abstraite) et un cercle qui implémente la forme. Bridge pattern est simplement une approche d'abstraction bidirectionnelle pour découpler l'implémentation ( dessin en cercle ) et la fonctionnalité Générique/abstraite (dessin dans la classe Shape ).
Qu'est-ce que ça veut vraiment dire? À première vue, cela ressemble à quelque chose que vous faites déjà ( par inversion de dépendance). Donc pas de soucis au sujet de avoir un moins-ridig ou plus de base de code modulaire. Mais c'est un peu plus la philosophie qui est derrière.
d'après ce que j'ai compris, le besoin d'un modèle d'utilisation pourrait émerger lorsque j'ai besoin d'ajouter de nouvelles classes qui sont étroitement liées au système actuel ( comme le RedCircle ou le GreenCircle ) et qui diffèrent par une seule fonctionnalité ( comme la couleur ). Et je vais avoir besoin D'un modèle de Pont particulièrement si les classes de système existantes (cercle ou forme ) doivent être changées fréquemment et vous ne le faites pas vous voulez que les nouvelles classes ajoutées soient affectées par ces changements. C'est pourquoi la fonctionnalité de dessin générique est abstraite dans une nouvelle interface afin que vous puissiez modifier le comportement du dessin indépendamment de la forme ou du cercle.
est un adaptateur amélioré. Pont comprend l'adaptateur et ajoute de la souplesse. Voici comment les éléments de réponse de Ravindra la carte entre les modèles:
Adapter | Bridge
-----------|---------------
Target | Abstraction
-----------|---------------
| RefinedAbstraction
|
| This element is Bridge specific. If there is a group of
| implementations that share the same logic, the logic can be placed here.
| For example, all cars split into two large groups: manual and auto.
| So, there will be two RefinedAbstraction classes.
-----------|---------------
Adapter | Implementor
-----------|---------------
Adaptee | ConcreteImplementor