{"id":1288,"date":"2020-02-14T11:01:29","date_gmt":"2020-02-14T09:01:29","guid":{"rendered":"http:\/\/www.lafabriquedecode.com\/blog\/?p=1288"},"modified":"2020-02-14T11:01:29","modified_gmt":"2020-02-14T09:01:29","slug":"ruby-design-pattern-adapter","status":"publish","type":"post","link":"http:\/\/www.lafabriquedecode.com\/blog\/2020\/02\/ruby-design-pattern-adapter\/","title":{"rendered":"Ruby: design pattern Adapter"},"content":{"rendered":"<h1>Adapt or die!<\/h1>\n<p>Le design pattern Adapter (ou Adaptateur en bon fran\u00e7ais) a d\u00e9j\u00e0 \u00e9t\u00e9 \u00e9voqu\u00e9 <a href=\"http:\/\/www.lafabriquedecode.com\/blog\/2014\/02\/php-le-design-pattern-adaptateur\/\">ici-m\u00eame<\/a> il y a quelques ann\u00e9es, aussi vous laisserai-je le plaisir d&rsquo;aller y voir les d\u00e9tails d&rsquo;impl\u00e9mentation si toutefois le code propos\u00e9 ici ne vous parlait pas imm\u00e9diatement !<\/p>\n<h1>Rafra\u00eechissons-nous la m\u00e9moire<\/h1>\n<p>L&rsquo;exemple est rigoureusement le m\u00eame, si l&rsquo;on excepte les particularit\u00e9s dues au langage Ruby (pas de classe abstraite, pas d&rsquo;interface), mais je vais en rappeler les contours: nous avons un inspecteur du permis de conduire qui fait faire les m\u00eames man\u0153uvres \u00e0 tous ses candidats. L&rsquo;ennui est que ces man\u0153uvres ne s&rsquo;effectuent pas de la m\u00eame fa\u00e7on selon que l&rsquo;on conduise un bateau \u00e0 voile, \u00e0 moteur, une voiture, une moto etc. Ainsi, notre inspecteur, qui manifestement n&rsquo;a pas tr\u00e8s envie de changer ses pratiques, va travailler avec des adaptateurs et non plus directement avec les classes feuilles de l&rsquo;arbre mat\u00e9rialisant la cha\u00eene d&rsquo;h\u00e9ritage. Il n&rsquo;y verra que du feu car ce sont les adaptateurs qui feront le travail \u00e0 sa place !<\/p>\n<p>Allez, en voiture !<\/p>\n<pre class=\"brush: ruby; title: ; notranslate\" title=\"\">\r\nclass InspecteurPermisConduire\r\n\r\n  def initialize(conducteur)\r\n    @candidat = conducteur\r\n  end\r\n\r\n  def changerCandidat(conducteur)\r\n    @candidat = conducteur\r\n  end\r\n\r\n  def fairePasserExamen\r\n    @candidat.demarrer\r\n    @candidat.accelerer\r\n    @candidat.tournerDroite\r\n    @candidat.accelerer\r\n    @candidat.tournerGauche\r\n    @candidat.ralentir\r\n    @candidat.reculer\r\n    @candidat.immobiliser\r\n  end\r\n\r\n  private\r\n\r\n  attr_reader :candidat\r\nend\r\n\r\nclass Conducteur\r\n  def initialize(conducteur)\r\n    raise &quot;Impossible d'instancier la classe Conducteur&quot;\r\n  end\r\n\r\n  def demarrer\r\n    raise NotImplementedError\r\n  end\r\n\r\n  def tournerGauche\r\n    raise NotImplementedError\r\n  end\r\n\r\n  def tournerDroite\r\n    raise NotImplementedError\r\n  end\r\n\r\n  def accelerer\r\n    raise NotImplementedError\r\n  end\r\n\r\n  def ralentir\r\n    raise NotImplementedError\r\n  end\r\n\r\n  def reculer\r\n    raise NotImplementedError\r\n  end\r\n\r\n  def immobiliser\r\n    raise NotImplementedError\r\n  end\r\nend\r\n\r\nclass Automobiliste\r\n\r\n  def demarrer\r\n    puts &quot;tourner la cl\u00e9 de contact ou mettre la carte&quot;\r\n  end\r\n\r\n  def tournerGauche\r\n    puts &quot;tourner le volant vers la gauche&quot;\r\n  end\r\n\r\n  def tournerDroite\r\n    puts &quot;tourner le volant vers la droite&quot;\r\n  end\r\n\r\n  def accelerer\r\n    puts &quot;appuyer sur la p\u00e9dale d'acc\u00e9l\u00e9ration&quot;\r\n  end\r\n\r\n  def ralentir\r\n    puts &quot;rel\u00e2cher la p\u00e9dale d'acc\u00e9l\u00e9ration et\/ou &quot; +\r\n             &quot;appuyer sur la p\u00e9dale de frein&quot;\r\n  end\r\n\r\n  def reculer\r\n    puts &quot;passer la marche arri\u00e8re et acc\u00e9l\u00e9rer&quot;\r\n  end\r\n\r\n  def immobiliser\r\n    puts &quot;mettre le frein \u00e0 main&quot;\r\n  end\r\nend\r\n\r\nclass Navigateur\r\n  def initialize\r\n    raise &quot;Impossible d'instancier la classe abstraite Navigateur&quot;\r\n  end\r\n\r\n  def demarrer\r\n    raise NotImplementedError\r\n  end\r\n\r\n  def reculer\r\n    raise NotImplementedError\r\n  end\r\n\r\n  def tournerBabord\r\n    raise NotImplementedError\r\n  end\r\n\r\n  def tournerTribord\r\n    raise NotImplementedError\r\n  end\r\n\r\n  def accelerer\r\n    raise NotImplementedError\r\n  end\r\n\r\n  def ralentir\r\n    raise NotImplementedError\r\n  end\r\n\r\n  def jeterAncre\r\n    raise NotImplementedError\r\n  end\r\nend\r\n\r\nclass Marin\r\n\r\n  def initialize\r\n    raise &quot;Impossible d'instancier la classe abstraite Marin&quot;\r\n  end\r\n\r\n  # m\u00e9thode commune \u00e0 tous les marins\r\n  def jeterAncre\r\n    puts &quot;jeter l'ancre \u00e0 la mer&quot;\r\n  end\r\nend\r\n\r\nclass MarinVoile &lt; Marin\r\n\r\n  def initialize\r\n    # vide mais on peut imaginer de la logique ici\r\n  end\r\n\r\n  def demarrer\r\n    puts &quot;Cette fonctionnalit\u00e9 n'est pas disponible&quot;\r\n  end\r\n\r\n  def tournerBabord\r\n    puts &quot;diriger les voiles et la barre pour aller \u00e0 babord&quot;\r\n  end\r\n\r\n  def tournerTribord\r\n    puts &quot;diriger les voiles et la barre pour aller \u00e0 tribord&quot;\r\n  end\r\n\r\n  def accelerer\r\n    puts &quot;positionner les voiles et d\u00e9terminer l'allure&quot;\r\n  end\r\n\r\n  def ralentir\r\n    puts &quot;positionner les voiles et d\u00e9terminer l'allure&quot;\r\n  end\r\n\r\n  def reculer\r\n    puts &quot;positionner les voiles et man\u0153uvrer pour reculer&quot;\r\n  end\r\nend\r\n\r\nclass MarinMoteur &lt; Marin\r\n\r\n  def initialize\r\n    # vide mais on peut imaginer de la logique ici\r\n  end\r\n\r\n  def demarrer\r\n    puts &quot;d\u00e9marrer le moteur&quot;\r\n  end\r\n\r\n  def tournerBabord\r\n    puts &quot;manoeuvrer la barre ou le volant pour aller \u00e0 babord&quot;\r\n  end\r\n\r\n  def tournerTribord\r\n    puts &quot;manoeuvrer la barre ou le volant pour aller \u00e0 tribord&quot;\r\n  end\r\n\r\n  def accelerer\r\n    puts &quot;augmenter la vitesse du moteur&quot;\r\n  end\r\n\r\n  def ralentir\r\n    puts &quot;dimininuer la vitesse du moteur ou le couper&quot;\r\n  end\r\n\r\n  def reculer\r\n    puts &quot;passer la marche arri\u00e8re&quot;\r\n  end\r\nend\r\n\r\nclass AdaptateurMarin\r\n\r\n  def initialize(marin)\r\n    @marin = marin\r\n  end\r\n\r\n  def demarrer\r\n    @marin.demarrer\r\n  end\r\n\r\n  def tournerGauche\r\n    @marin.tournerBabord\r\n  end\r\n\r\n  def tournerDroite\r\n    @marin.tournerTribord\r\n  end\r\n\r\n  def accelerer\r\n    @marin.accelerer\r\n  end\r\n\r\n  def ralentir\r\n    @marin.ralentir\r\n  end\r\n\r\n  def reculer\r\n    @marin.reculer\r\n  end\r\n\r\n  def immobiliser\r\n    @marin.jeterAncre\r\n  end\r\n\r\n  private\r\n\r\n  attr_reader :marin\r\nend\r\n\r\nputs &quot;AUTOMOBILISTE&quot;\r\ninspecteur = InspecteurPermisConduire.new(Automobiliste.new)\r\ninspecteur.fairePasserExamen\r\nputs &quot;MARIN MOTEUR&quot;\r\nadaptateur = AdaptateurMarin.new(MarinMoteur.new)\r\ninspecteur = InspecteurPermisConduire.new(adaptateur)\r\ninspecteur.fairePasserExamen\r\nputs &quot;MARIN VOILE&quot;\r\nadaptateur = AdaptateurMarin.new(MarinVoile.new)\r\ninspecteur.changerCandidat(adaptateur)\r\ninspecteur.fairePasserExamen\r\n\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Adapt or die! Le design pattern Adapter (ou Adaptateur en bon fran\u00e7ais) a d\u00e9j\u00e0 \u00e9t\u00e9 \u00e9voqu\u00e9 ici-m\u00eame il y a quelques ann\u00e9es, aussi vous laisserai-je le plaisir d&rsquo;aller y voir les d\u00e9tails d&rsquo;impl\u00e9mentation si toutefois le code propos\u00e9 ici ne vous parlait pas imm\u00e9diatement ! Rafra\u00eechissons-nous la m\u00e9moire L&rsquo;exemple est rigoureusement le m\u00eame, si l&rsquo;on [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[24,14,96,29],"tags":[72,111,108,106],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.6.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Ruby: design pattern Adapter - La Fabrique de code - Tech blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.lafabriquedecode.com\/blog\/2020\/02\/ruby-design-pattern-adapter\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ruby: design pattern Adapter - La Fabrique de code - Tech blog\" \/>\n<meta property=\"og:description\" content=\"Adapt or die! Le design pattern Adapter (ou Adaptateur en bon fran\u00e7ais) a d\u00e9j\u00e0 \u00e9t\u00e9 \u00e9voqu\u00e9 ici-m\u00eame il y a quelques ann\u00e9es, aussi vous laisserai-je le plaisir d&rsquo;aller y voir les d\u00e9tails d&rsquo;impl\u00e9mentation si toutefois le code propos\u00e9 ici ne vous parlait pas imm\u00e9diatement ! Rafra\u00eechissons-nous la m\u00e9moire L&rsquo;exemple est rigoureusement le m\u00eame, si l&rsquo;on [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.lafabriquedecode.com\/blog\/2020\/02\/ruby-design-pattern-adapter\/\" \/>\n<meta property=\"og:site_name\" content=\"La Fabrique de code - Tech blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-02-14T09:01:29+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary\" \/>\n<meta name=\"twitter:creator\" content=\"@LaFabrique2Code\" \/>\n<meta name=\"twitter:site\" content=\"@LaFabrique2Code\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2020\/02\/ruby-design-pattern-adapter\/\",\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/2020\/02\/ruby-design-pattern-adapter\/\",\"name\":\"Ruby: design pattern Adapter - La Fabrique de code - Tech blog\",\"isPartOf\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#website\"},\"datePublished\":\"2020-02-14T09:01:29+00:00\",\"dateModified\":\"2020-02-14T09:01:29+00:00\",\"author\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162\"},\"breadcrumb\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2020\/02\/ruby-design-pattern-adapter\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.lafabriquedecode.com\/blog\/2020\/02\/ruby-design-pattern-adapter\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2020\/02\/ruby-design-pattern-adapter\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"http:\/\/www.lafabriquedecode.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ruby: design pattern Adapter\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#website\",\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/\",\"name\":\"La Fabrique de code - Tech blog\",\"description\":\"PHP objet, MySQL, Design Patterns, OOP...et plus !\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/www.lafabriquedecode.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g\",\"contentUrl\":\"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g\",\"caption\":\"admin\"},\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/author\/admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Ruby: design pattern Adapter - La Fabrique de code - Tech blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/www.lafabriquedecode.com\/blog\/2020\/02\/ruby-design-pattern-adapter\/","og_locale":"fr_FR","og_type":"article","og_title":"Ruby: design pattern Adapter - La Fabrique de code - Tech blog","og_description":"Adapt or die! Le design pattern Adapter (ou Adaptateur en bon fran\u00e7ais) a d\u00e9j\u00e0 \u00e9t\u00e9 \u00e9voqu\u00e9 ici-m\u00eame il y a quelques ann\u00e9es, aussi vous laisserai-je le plaisir d&rsquo;aller y voir les d\u00e9tails d&rsquo;impl\u00e9mentation si toutefois le code propos\u00e9 ici ne vous parlait pas imm\u00e9diatement ! Rafra\u00eechissons-nous la m\u00e9moire L&rsquo;exemple est rigoureusement le m\u00eame, si l&rsquo;on [&hellip;]","og_url":"http:\/\/www.lafabriquedecode.com\/blog\/2020\/02\/ruby-design-pattern-adapter\/","og_site_name":"La Fabrique de code - Tech blog","article_published_time":"2020-02-14T09:01:29+00:00","author":"admin","twitter_card":"summary","twitter_creator":"@LaFabrique2Code","twitter_site":"@LaFabrique2Code","twitter_misc":{"\u00c9crit par":"admin","Dur\u00e9e de lecture estim\u00e9e":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"http:\/\/www.lafabriquedecode.com\/blog\/2020\/02\/ruby-design-pattern-adapter\/","url":"http:\/\/www.lafabriquedecode.com\/blog\/2020\/02\/ruby-design-pattern-adapter\/","name":"Ruby: design pattern Adapter - La Fabrique de code - Tech blog","isPartOf":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/#website"},"datePublished":"2020-02-14T09:01:29+00:00","dateModified":"2020-02-14T09:01:29+00:00","author":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162"},"breadcrumb":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/2020\/02\/ruby-design-pattern-adapter\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["http:\/\/www.lafabriquedecode.com\/blog\/2020\/02\/ruby-design-pattern-adapter\/"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/www.lafabriquedecode.com\/blog\/2020\/02\/ruby-design-pattern-adapter\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"http:\/\/www.lafabriquedecode.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Ruby: design pattern Adapter"}]},{"@type":"WebSite","@id":"http:\/\/www.lafabriquedecode.com\/blog\/#website","url":"http:\/\/www.lafabriquedecode.com\/blog\/","name":"La Fabrique de code - Tech blog","description":"PHP objet, MySQL, Design Patterns, OOP...et plus !","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/www.lafabriquedecode.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162","name":"admin","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/image\/","url":"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g","contentUrl":"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g","caption":"admin"},"url":"http:\/\/www.lafabriquedecode.com\/blog\/author\/admin\/"}]}},"_links":{"self":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/1288"}],"collection":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/comments?post=1288"}],"version-history":[{"count":1,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/1288\/revisions"}],"predecessor-version":[{"id":1289,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/1288\/revisions\/1289"}],"wp:attachment":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/media?parent=1288"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/categories?post=1288"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/tags?post=1288"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}