174 votes

Différence entre le motif de conception Bridge et le motif de conception Adaptateur

Quelle est la différence entre les patrons de conception Bridge et Adapter?

0 votes

Peut-être envisager d'offrir une édition de clarification pour orienter la discussion sur l'endroit où vous pensez avoir besoin d'utiliser l'un ou l'autre.

0 votes

0 votes

Aucune explication ici ne remplacera jamais la lecture de Design Patterns: Elements of Reusable Object-Oriented Software

0voto

Arnab Dutta Points 125

Il y a plein de réponses Pour distinguer entre Adapter et Bridge. Mais comme les gens recherchent des exemples de code, je donnerais un exemple du Pattern de Conception Adapter élaboré dans une histoire chronologique :

    //---------------------------------------Fournisseur/Provider Externe--------------------------------

            //Adaptee | RussianTankInterface est l'adapté | l'adapté vit dans son propre monde de rêve et se moque de toute autre classe ou interface
            RussianTankInterface smerch9K58 = new RussianTank("L'artillerie russe achetée par l'Inde en octobre 2015");
                smerch9K58.aboutMyself();
                smerch9K58.stuff();
                smerch9K58.rotate();
                smerch9K58.launch();

    //---------------------------------2016 : L'Inde fabrique le Bharat52 ------------------------------ 

            //Client_1 :: IndianTank 
            EnemyAttacker bharat52Attacker = new IndianTank("Char construit en Inde livré à l'armée en juillet 2016"); 

            // se comporte normalement -------------------------(1)
                bharat52Attacker.aboutMe();
                bharat52Attacker.load();
                bharat52Attacker.revolve();
                bharat52Attacker.fireArtillery();

    //---------------------------------2019 : L'Inde fabrique le Pinaka, et réfléchit à une fusion avec la technologie russe - donc une adaptation est nécessaire ------------------------------ 

            //Client_2 :: IndianTank 
            EnemyAttacker pinakaAttacker = new IndianTank("Char construit en Inde en 1998 mis à jour_v1 le 9 septembre 2019"); 

#####----Coalition-Bilatérale se produit----## 
#####       Inde  : Je veux une fusion de technologie d'artillerie avec 
#####                       1) Matériaux et cerveau indiens mais
#####                       2) Technologie de mouvement de pièces de machine russe 
#####       Russie : Donne-moi ton Interface - au maximum nous pouvons aider en fournissant un Adaptateur 

    //---------------------------------------Fournisseur/Provider Externe-----------------------------------

            //Adaptateur :: RussianTechnologyAdapter | La Russie obtient uniquement l'interface EnemyAttacker de l'Inde & crée RussianTechnologyAdapter 
            RussianTechnologyAdapter russianTechnologyAdapter = new RussianTechnologyAdapter(smerch9K58);

            //Cible | EnemyAttacker était initialement ClientInterface mais devient plus tard la Cible à mesure que l'histoire évolue | <- le client possède cette Interface
            EnemyAttacker dhanushAttacker = russianTechnologyAdapter;

#####----La Russie tient parole----## 
#####       Russie à l'Inde : Tiens, prends Dhanush, une enveloppe autour de notre adaptateur encapsulé, et branche tout ce qui est conforme à ton EnemyAttacker.
#####       Inde : Merci beaucoup!

    //--------------------------------- 2020 : L'Inde retourne heureuse avec dhanushAttacker--------------------------------------- 

            //Client_2 - comportement adapté -------------------------(2)
                dhanushAttacker.setNavigationCapability(pinakaAttacker.getCuttingEdgeNavigableTargets());
                dhanushAttacker.aboutMe(); //appelle l'instance russe -> aboutMyself()
                dhanushAttacker.load();    //appelle l'instance russe -> stuff()
                dhanushAttacker.revolve(); //appelle l'instance russe -> rotate()
                dhanushAttacker.fireArtillery();  //appelle l'instance russe -> launch()

Remarquez attentivement :

  • La même API dans (1) & (2) se comporte différemment
  • L'Inde peut insérer son cerveau dans le wireFrame de la Russie par exemple dhanushAttacker.setNavigationCapability(pinakaAttacker.get(..))

Points remarquables

Le côté Client possède :

-  L'Appelant / Utilisateur(utilise Adapter plus tard)/Client
-  ClientInterface (alias Cible)

Partagé plus tard :

- Interface Client (devient Cible après le partage)

Le côté Récepteur possède :

- Adaptateur (partagé directement ou en tant qu'enveloppe )  
- Adapté

En espérant que quelqu'un donne aussi un exemple pour Bridge :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X