{"id":777,"date":"2014-02-25T15:55:36","date_gmt":"2014-02-25T13:55:36","guid":{"rendered":"http:\/\/www.lafabriquedecode.com\/blog\/?p=777"},"modified":"2014-02-25T15:55:36","modified_gmt":"2014-02-25T13:55:36","slug":"php-le-design-pattern-adaptateur","status":"publish","type":"post","link":"http:\/\/www.lafabriquedecode.com\/blog\/2014\/02\/php-le-design-pattern-adaptateur\/","title":{"rendered":"PHP : le design pattern Adaptateur"},"content":{"rendered":"<h1>Chez Auto Load, tout est permis !<\/h1>\n<p>Pour illustrer notre exemple du <em>design pattern<\/em> Adaptateur, nous allons cette fois nous prendre pour des inspecteurs du permis de conduire ! Chez AUTO LOAD, nous nous vantons d&rsquo;obtenir un taux de r\u00e9ussite de 99% \u00e0 l&rsquo;examen du permis de conduire et ce sans soudoyer de quelque mani\u00e8re que ce soit nos candidats ! Voyons sans tarder les principales classes qui composent notre exemple. Tout d&rsquo;abord, la classe <strong>InspecteurPermisConduire<\/strong>, qui est notre classe cliente. C&rsquo;est elle qui va faire usage de nos autres classes.<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\nclass InspecteurPermisConduire {\r\n    private $_candidat;\r\n\t\r\n    public function __construct(ConducteurInterface $conducteur)\r\n    {\r\n        $this-&gt;_candidat = $conducteur;\r\n    }\r\n    public function changerCandidat(ConducteurInterface $conducteur)\r\n    {\r\n        $this-&gt;_candidat = $conducteur;\r\n    }\r\n    public function fairePasserExamen()\r\n    {\r\n        $this-&gt;_candidat-&gt;demarrer();\r\n        $this-&gt;_candidat-&gt;accelerer();\r\n        $this-&gt;_candidat-&gt;tournerDroite();\r\n        $this-&gt;_candidat-&gt;accelerer();\r\n        $this-&gt;_candidat-&gt;tournerGauche();\r\n        $this-&gt;_candidat-&gt;ralentir();\r\n        $this-&gt;_candidat-&gt;reculer();\r\n        $this-&gt;_candidat-&gt;immobiliser();\r\n    }\r\n}\r\n<\/pre>\n<p>Une instance donn\u00e9e d&rsquo;InspecteurPermisConduire prend en composition tout objet se conformant \u00e0 l&rsquo;interface <strong>ConducteurInterface<\/strong> : tout d&rsquo;abord, elle l&rsquo;exige dans son constructeur, c&rsquo;est \u00e0 dire qu&rsquo;aucune instance d&rsquo;InspecteurPermisConduire ne peut exister sans un objet qui impl\u00e9mente en totalit\u00e9 ConducteurInterface. Ensuite, nous nous r\u00e9servons la possibilit\u00e9 de changer de type de candidat \u00e0 l&rsquo;ex\u00e9cution (<em>runtime<\/em>) gr\u00e2ce \u00e0 un <em>setter<\/em>. Enfin, la valeur ajout\u00e9e de notre classe r\u00e9side dans sa m\u00e9thode <strong>fairePasserExamen<\/strong>, qui fait effectuer \u00e0 tout conducteur les man\u0153uvres de base, indispensables pour d\u00e9crocher le pr\u00e9cieux s\u00e9same !<\/p>\n<p>Voici justement notre Automobiliste :<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\ninterface ConducteurInterface {\r\n\tpublic function demarrer();\r\n\tpublic function tournerGauche();\r\n\tpublic function tournerDroite();\r\n\tpublic function accelerer();\r\n\tpublic function ralentir();\r\n\tpublic function reculer();\r\n\tpublic function immobiliser();\r\n}\r\n\r\nclass Automobiliste implements ConducteurInterface {\r\n\tpublic function demarrer() {\r\n\t\techo &quot;tourner la cl\u00e9 de contact ou mettre la carte&quot;;\r\n\t}\r\n\tpublic function tournerGauche() {\r\n\t\techo &quot;tourner le volant vers la gauche&quot;;\r\n\t}\r\n\tpublic function tournerDroite() {\r\n\t\techo &quot;tourner le volant vers la droite&quot;;\r\n\t}\r\n\tpublic function accelerer() {\r\n\t\techo &quot;appuyer sur la p\u00e9dale d'acc\u00e9l\u00e9ration&quot;;\r\n\t}\r\n\tpublic function ralentir() {\r\n\t\techo &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\t}\r\n\tpublic function reculer() {\r\n\t\techo &quot;passer la marche arri\u00e8re et acc\u00e9l\u00e9rer&quot;;\r\n\t}\r\n\tpublic function immobiliser() {\r\n\t\techo &quot;mettre le frein \u00e0 main&quot;;\r\n\t}\r\n}\r\n<\/pre>\n<p>Notre classe concr\u00e8te <strong>Automobiliste<\/strong> impl\u00e9mente les fonctions impos\u00e9es par l&rsquo;interface <strong>ConducteurInterface<\/strong>. Cette interface recense les principales manoeuvres dont la ma\u00eetrise est exig\u00e9e de tout conducteur de v\u00e9hicule qui se respecte : d\u00e9marrer et arr\u00eater le v\u00e9hicule, avancer, reculer, tourner, acc\u00e9l\u00e9rer et ralentir. Attention cependant, certains v\u00e9hicules &#8211; comme un v\u00e9lo &#8211; ne se d\u00e9marrent pas, il va falloir prendre en compte cet aspect l\u00e0&#8230;<\/p>\n<p>Bref, \u00e0 ce stade l\u00e0, tout est pour le mieux dans le meilleur des mondes ! [Candide]<\/p>\n<p><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/02\/schema.png\"><img loading=\"lazy\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/02\/schema.png\" alt=\"Sch\u00e9ma UML de l&#039;exemple de design pattern adaptateur\" width=\"491\" height=\"319\" class=\"alignnone size-full wp-image-823\" srcset=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/02\/schema.png 491w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/02\/schema-300x194.png 300w\" sizes=\"(max-width: 491px) 100vw, 491px\" \/><\/a><\/p>\n<h1>D\u00e8s que le vent soufflera, je recodera&#8230; (air bien connu)<\/h1>\n<p>Jusqu&rsquo;au jour o\u00f9 Otto Hekohl, le propri\u00e9taire de notre \u00e9cole de conduite, vient nous annoncer qu&rsquo;\u00e9tant donn\u00e9 que nous sommes situ\u00e9s en bord de mer, il serait plut\u00f4t judicieux &#8211; en plus d&rsquo;\u00eatre diablement b\u00e9n\u00e9fique pour notre chiffre d&rsquo;affaire &#8211; que nous puissions faire passer le permis bateau \u00e0 des candidats qui sont de plus en plus nombreux et demandeurs&#8230;<\/p>\n<div id=\"attachment_789\" style=\"width: 335px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/02\/girls-on-the-yacht.jpg\"><img aria-describedby=\"caption-attachment-789\" loading=\"lazy\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/02\/girls-on-the-yacht.jpg\" alt=\"Photos de gens sautant d&#039;un yacht\" width=\"325\" height=\"239\" class=\"size-full wp-image-789\" srcset=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/02\/girls-on-the-yacht.jpg 325w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/02\/girls-on-the-yacht-300x220.jpg 300w\" sizes=\"(max-width: 325px) 100vw, 325px\" \/><\/a><p id=\"caption-attachment-789\" class=\"wp-caption-text\">Elle est parfois dure la vie \u00e0 bord d&rsquo;un fr\u00eale esquif !<\/p><\/div>\n<p>Avant de se faire cong\u00e9dier par notre patron pour avoir regard\u00e9 trop de vid\u00e9os de chatons montant sur le dos de tortues durant ses heures de travail, Jojo Dingo, le deuxi\u00e8me programmeur de l&rsquo;entreprise, avait envisag\u00e9 d&rsquo;int\u00e9grer ce changement de notre strat\u00e9gie commerciale. Voici la structure logicielle dont nous h\u00e9ritons, maintenant que Jojo a toutes ses journ\u00e9es de libre pour s&rsquo;adonner \u00e0 sa f\u00e9linophilie maladive :<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\ninterface NavigateurInterface {\r\n\tpublic function demarrer();\r\n\tpublic function reculer();\r\n\tpublic function tournerBabord();\r\n\tpublic function tournerTribord();\r\n\tpublic function accelerer();\r\n\tpublic function ralentir();\r\n\tpublic function jeterAncre();\r\n}\r\n\r\nabstract class Marin implements NavigateurInterface {\r\n\tpublic function jeterAncre() {\r\n\t\techo &quot;jeter l'ancre \u00e0 la mer&quot;;\r\n\t}\r\n}\r\n\r\nclass UnsupportedMethodException extends Exception {}\r\n\r\nclass MarinVoile extends Marin {\r\n\tpublic function demarrer() {\r\n\t\tthrow new UnsupportedMethodException\r\n                     (&quot;Cette fonctionnalit\u00e9 n'est pas disponible&quot;);\r\n\t}\r\n\tpublic function tournerBabord() {\r\n\t\techo &quot;diriger les voiles et la barre pour aller \u00e0 babord&quot;;\r\n\t}\r\n\tpublic function tournerTribord() {\r\n\t\techo &quot;diriger les voiles et la barre pour aller \u00e0 tribord&quot;;\r\n\t}\r\n\tpublic function accelerer() {\r\n\t\techo &quot;positionner les voiles et d\u00e9terminer l'allure&quot;;\r\n\t}\r\n\tpublic function ralentir() {\r\n\t\techo &quot;positionner les voiles et d\u00e9terminer l'allure&quot;;\r\n\t}\r\n\tpublic function reculer() {\r\n\t\techo &quot;positionner les voiles et man\u0153uvrer pour reculer&quot;;\r\n\t}\r\n}\r\n\r\nclass MarinMoteur extends Marin {\r\n\tpublic function demarrer() {\r\n\t\techo &quot;d\u00e9marrer le moteur&quot;;\r\n\t}\r\n\tpublic function tournerBabord() {\r\n\t\techo &quot;manoeuvrer la barre ou le volant pour aller \u00e0 babord&quot;;\r\n\t}\r\n\tpublic function tournerTribord() {\r\n\t\techo &quot;manoeuvrer la barre ou le volant pour aller \u00e0 tribord&quot;;\r\n\t}\r\n\tpublic function accelerer() {\r\n\t\techo &quot;augmenter la vitesse du moteur&quot;;\r\n\t}\r\n\tpublic function ralentir() {\r\n\t\techo &quot;dimininuer la vitesse du moteur ou le couper&quot;;\r\n\t}\r\n\tpublic function reculer() {\r\n\t\techo &quot;passer la marche arri\u00e8re&quot;;\r\n\t}\r\n}\r\n<\/pre>\n<p>Jojo a bien compris qu&rsquo;il nous fallait des classes qui nous permettent de g\u00e9rer les gens qui s&rsquo;adonnent \u00e0 la navigation de plaisance motoris\u00e9e ou \u00e0 voile et qu&rsquo;un bateau ne se man\u0153uvrait pas comme une voiture.<\/p>\n<p>Attardons-nous sur la structure de ces classes : nous avons une classe abstraite <strong>Marin<\/strong> qui impl\u00e9mente une interface <strong>NavigateurInterface<\/strong> et dont les deux filles concr\u00e8tes <strong>MarinVoile<\/strong> et <strong>MarinMoteur<\/strong> r\u00e9alisent la majeure partie des fonctions.<\/p>\n<p><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/02\/schema2.png\"><img loading=\"lazy\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/02\/schema2.png\" alt=\"Sch\u00e9ma UML du design pattern adaptateur\" width=\"488\" height=\"325\" class=\"alignnone size-full wp-image-826\" srcset=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/02\/schema2.png 488w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/02\/schema2-300x199.png 300w\" sizes=\"(max-width: 488px) 100vw, 488px\" \/><\/a><\/p>\n<p>Marin est abstraite car trop g\u00e9n\u00e9rique, elle r\u00e9alise cependant l&rsquo;impl\u00e9mentation de <strong>jeterAncre<\/strong>, qui est commune \u00e0 toute forme de navigation (bon, c&rsquo;est vrai, les Optimist n&rsquo;ont pas d&rsquo;ancre). Jojo a choisi de cr\u00e9er une exception pour g\u00e9rer le cas o\u00f9 la fonction d\u00e9marrer n&rsquo;est pas prise en charge, plut\u00f4t que de l&rsquo;isoler dans une interface NavigateurMoteurInterface d\u00e9di\u00e9e aux bateaux qui ont ce mode de propulsion. C&rsquo;est un choix de conception, qui a le m\u00e9rite de favoriser la g\u00e9n\u00e9ricit\u00e9, inutile de faire une v\u00e9rification de la pr\u00e9sence de cette m\u00e9thode en utilisant par exemple <em>method_exists<\/em> dans la classe client InspecteurPermisConduire. C&rsquo;est la classe concr\u00e8te qui g\u00e8re l&rsquo;absence de cette m\u00e9thode en levant une exception correctement typ\u00e9e.<\/p>\n<h1>Comment ne pas se faire mener en bateau ?<\/h1>\n<p>Adeptes de longue date de la programmation orient\u00e9e objet, nous souhaitons minimiser l&rsquo;impact de ce changement d&rsquo;architecture logicielle dans nos classes existantes. C&rsquo;est l\u00e0 o\u00f9 l&rsquo;adaptateur entre en jeu !<\/p>\n<p>L&rsquo;adaptateur fonctionne exactement sur le m\u00eame principe que l&rsquo;adaptateur de votre s\u00e8che-cheveux quand vous allez, en Irlande, par exemple ! Il prend en entr\u00e9e la prise fran\u00e7aise de votre s\u00e8che-cheveux favori et l&rsquo;adapte aux prises \u00e0 trois broches que vous trouvez sur l&rsquo;\u00eele \u00c9meraude ! Vous n&rsquo;avez pas eu \u00e0 d\u00e9nuder les fils de votre appareil pour y fixer une prise irlandaise, et heureusement : l&rsquo;adaptateur fait le travail pour vous ! Et vous n&rsquo;y avez vu que du bleu !<\/p>\n<h1>S&rsquo;adapter&#8230;au changement<\/h1>\n<p>L&rsquo;adaptateur a pour but de faire collaborer des interfaces de prime abord incompatibles, comme <strong>ConducteurInterface<\/strong> et <strong>NavigateurInterface<\/strong>. C&rsquo;est un interm\u00e9diaire pr\u00e9cieux (et r\u00e9utilisable, ce qui nous met en joie !) qui va nous \u00e9viter de d\u00e9stabiliser notre <i>code base<\/i> et qui va d\u00e9coupler le client (notre inspecteur du permis de conduire) de notre adapt\u00e9 (ici, nos marins). Plus le couplage est l\u00e2che, mieux c&rsquo;est, je ne vous apprends rien !<\/p>\n<p>L&rsquo;adaptateur prend en composition l&rsquo;adapt\u00e9, et il sera charg\u00e9 d&rsquo;effectuer la translation entre les demandes \u00e0 destination de l&rsquo;interface originelle (<i>ConducteurInterface<\/i>) et la nouvelle interface cible (<i>NavigateurInterface<\/i>).<\/p>\n<p>Pour que cette translation s&rsquo;effectue de mani\u00e8re transparente pour le syst\u00e8me, il faut naturellement que l&rsquo;adaptateur impl\u00e9mente l&rsquo;interface originelle. Regardez donc :<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\nclass AdaptateurMarin implements ConducteurInterface {\r\n\tprivate $_marin;\r\n\t\r\n\tpublic function __construct(Marin $marin) {\r\n\t\t$this-&gt;_marin = $marin;\r\n\t}\r\n\tpublic function demarrer() {\r\n\t\t$this-&gt;_marin-&gt;demarrer();\r\n\t}\r\n\tpublic function tournerGauche() {\r\n\t\t$this-&gt;_marin-&gt;tournerBabord();\r\n\t}\r\n\tpublic function tournerDroite() {\r\n\t\t$this-&gt;_marin-&gt;tournerTribord();\r\n\t}\r\n\tpublic function accelerer() {\r\n\t\t$this-&gt;_marin-&gt;accelerer();\r\n\t}\r\n\tpublic function ralentir() {\r\n\t\t$this-&gt;_marin-&gt;ralentir();\r\n\t}\r\n\tpublic function reculer() {\r\n\t\t$this-&gt;_marin-&gt;reculer();\r\n\t}\r\n\tpublic function immobiliser() {\r\n\t\t$this-&gt;_marin-&gt;jeterAncre();\r\n\t}\r\n}\r\n<\/pre>\n<p>Le polymorphisme avant tout ! Notre adaptateur prend en charge des objets de la classe Marin, c&rsquo;est \u00e0 dire potentiellement toutes les sous-classes qui en d\u00e9rivent. Tant mieux car nous en avons deux : MarinVoile et MarinMoteur !<\/p>\n<p>Nous n&rsquo;avons pas du tout modifi\u00e9 notre classe existante, nous avons isol\u00e9 la nouveaut\u00e9 dans une nouvelle classe, autonome, avec des responsabilit\u00e9s clairement identifi\u00e9es.<\/p>\n<blockquote><p>Les comportements que vous isolez dans des unit\u00e9s de code ind\u00e9pendantes sont r\u00e9utilisables, ceux que vous enfermez dans des classes ne le sont pas forc\u00e9ment !<\/p><\/blockquote>\n<p>Pour que le syst\u00e8me prenne en compte cette nouvelle possibilit\u00e9 (\u00e0 nous l&rsquo;argent facile !), il nous faudra juste modifier le code appelant. Notre client avait d\u00e9j\u00e0 un modificateur d&rsquo;impl\u00e9ment\u00e9, \u00e0 la bonne heure, servons nous en donc !<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n$adaptateur = new AdaptateurMarin(new MarinMoteur());\r\n$inspecteur-&gt;changerCandidat($adaptateur);\r\n$inspecteur-&gt;fairePasserExamen();\r\n<\/pre>\n<p>La m\u00e9thode <strong>changerCandidat<\/strong> exige en param\u00e8tre une impl\u00e9mentation de la classe ConducteurInterface, \u00e7a tombe bien c&rsquo;est pr\u00e9cis\u00e9ment ce qu&rsquo;est <strong>Marin<\/strong> et ses filles concr\u00e8tes.<\/p>\n<p>Souvenez vous toutefois qu&rsquo;une exception est lev\u00e9e dans notre adaptateur <strong>MarinVoile<\/strong>, il faut donc en r\u00e9alit\u00e9 modifier quelque peu le code appelant, qui va devoir les intercepter et les traiter le cas \u00e9ch\u00e9ant. N&rsquo;allons pas chercher midi \u00e0 quatorze heures, nous nous contenterons d&rsquo;en afficher le message. \u00ab\u00a0KISS\u00a0\u00bb is the law !<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\ntry {\r\n\t$inspecteur-&gt;fairePasserExamen();\r\n} catch (UnsupportedMethodException $exception) {\r\n\techo $exception-&gt;getMessage();\r\n}\r\n<\/pre>\n<p>Voici maintenant l&rsquo;architecture de notre code, avec l&rsquo;adaptateur qui est venu s&rsquo;intercaler entre l&rsquo;existant et nos nouvelles fonctionnalit\u00e9s, qui vont nous permettre de g\u00e9rer marins d&rsquo;eau douce, flibustiers, jeunes loups de mer, moules \u00e0 gaufres et autres ectoplasmes !<\/p>\n<p><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/02\/schema22.png\"><img loading=\"lazy\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/02\/schema22.png\" alt=\"schema2\" width=\"806\" height=\"260\" class=\"alignnone size-full wp-image-830\" srcset=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/02\/schema22.png 806w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/02\/schema22-300x96.png 300w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/02\/schema22-624x201.png 624w\" sizes=\"(max-width: 806px) 100vw, 806px\" \/><\/a><\/p>\n<p>Pour lire cet article dans des conditions optimales, il est fortement conseill\u00e9 d&rsquo;\u00e9couter autant de fois que n\u00e9cessaire ce titre (en plus d&rsquo;aller les voir <a href=\"http:\/\/www.infoconcert.com\/artiste\/toy-dolls-28852\/concerts.html\" target=\"_blank\">en concert en mai 2014<\/a>) :<\/p>\n<p><iframe loading=\"lazy\" width=\"320\" height=\"240\" src=\"http:\/\/www.youtube.com\/embed\/LJOz9BNwV4Y?feature=oembed\" frameborder=\"0\" allowfullscreen><\/iframe><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Chez Auto Load, tout est permis ! Pour illustrer notre exemple du design pattern Adaptateur, nous allons cette fois nous prendre pour des inspecteurs du permis de conduire ! Chez AUTO LOAD, nous nous vantons d&rsquo;obtenir un taux de r\u00e9ussite de 99% \u00e0 l&rsquo;examen du permis de conduire et ce sans soudoyer de quelque mani\u00e8re [&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,40,3,29],"tags":[72,43],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.6.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>PHP : le design pattern Adaptateur - 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\/2014\/02\/php-le-design-pattern-adaptateur\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PHP : le design pattern Adaptateur - La Fabrique de code - Tech blog\" \/>\n<meta property=\"og:description\" content=\"Chez Auto Load, tout est permis ! Pour illustrer notre exemple du design pattern Adaptateur, nous allons cette fois nous prendre pour des inspecteurs du permis de conduire ! Chez AUTO LOAD, nous nous vantons d&rsquo;obtenir un taux de r\u00e9ussite de 99% \u00e0 l&rsquo;examen du permis de conduire et ce sans soudoyer de quelque mani\u00e8re [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.lafabriquedecode.com\/blog\/2014\/02\/php-le-design-pattern-adaptateur\/\" \/>\n<meta property=\"og:site_name\" content=\"La Fabrique de code - Tech blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-02-25T13:55:36+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/02\/schema.png\" \/>\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=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2014\/02\/php-le-design-pattern-adaptateur\/\",\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/2014\/02\/php-le-design-pattern-adaptateur\/\",\"name\":\"PHP : le design pattern Adaptateur - La Fabrique de code - Tech blog\",\"isPartOf\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#website\"},\"datePublished\":\"2014-02-25T13:55:36+00:00\",\"dateModified\":\"2014-02-25T13:55:36+00:00\",\"author\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162\"},\"breadcrumb\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2014\/02\/php-le-design-pattern-adaptateur\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.lafabriquedecode.com\/blog\/2014\/02\/php-le-design-pattern-adaptateur\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2014\/02\/php-le-design-pattern-adaptateur\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"http:\/\/www.lafabriquedecode.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PHP : le design pattern Adaptateur\"}]},{\"@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":"PHP : le design pattern Adaptateur - 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\/2014\/02\/php-le-design-pattern-adaptateur\/","og_locale":"fr_FR","og_type":"article","og_title":"PHP : le design pattern Adaptateur - La Fabrique de code - Tech blog","og_description":"Chez Auto Load, tout est permis ! Pour illustrer notre exemple du design pattern Adaptateur, nous allons cette fois nous prendre pour des inspecteurs du permis de conduire ! Chez AUTO LOAD, nous nous vantons d&rsquo;obtenir un taux de r\u00e9ussite de 99% \u00e0 l&rsquo;examen du permis de conduire et ce sans soudoyer de quelque mani\u00e8re [&hellip;]","og_url":"http:\/\/www.lafabriquedecode.com\/blog\/2014\/02\/php-le-design-pattern-adaptateur\/","og_site_name":"La Fabrique de code - Tech blog","article_published_time":"2014-02-25T13:55:36+00:00","og_image":[{"url":"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/02\/schema.png"}],"author":"admin","twitter_card":"summary","twitter_creator":"@LaFabrique2Code","twitter_site":"@LaFabrique2Code","twitter_misc":{"\u00c9crit par":"admin","Dur\u00e9e de lecture estim\u00e9e":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"http:\/\/www.lafabriquedecode.com\/blog\/2014\/02\/php-le-design-pattern-adaptateur\/","url":"http:\/\/www.lafabriquedecode.com\/blog\/2014\/02\/php-le-design-pattern-adaptateur\/","name":"PHP : le design pattern Adaptateur - La Fabrique de code - Tech blog","isPartOf":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/#website"},"datePublished":"2014-02-25T13:55:36+00:00","dateModified":"2014-02-25T13:55:36+00:00","author":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162"},"breadcrumb":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/2014\/02\/php-le-design-pattern-adaptateur\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["http:\/\/www.lafabriquedecode.com\/blog\/2014\/02\/php-le-design-pattern-adaptateur\/"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/www.lafabriquedecode.com\/blog\/2014\/02\/php-le-design-pattern-adaptateur\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"http:\/\/www.lafabriquedecode.com\/blog\/"},{"@type":"ListItem","position":2,"name":"PHP : le design pattern Adaptateur"}]},{"@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\/777"}],"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=777"}],"version-history":[{"count":49,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/777\/revisions"}],"predecessor-version":[{"id":831,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/777\/revisions\/831"}],"wp:attachment":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/media?parent=777"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/categories?post=777"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/tags?post=777"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}