{"id":174,"date":"2013-04-09T11:39:31","date_gmt":"2013-04-09T09:39:31","guid":{"rendered":"http:\/\/www.lafabriquedecode.com\/blog\/?p=174"},"modified":"2013-04-09T11:39:31","modified_gmt":"2013-04-09T09:39:31","slug":"php-un-exemple-simple-de-design-pattern-decorator","status":"publish","type":"post","link":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-un-exemple-simple-de-design-pattern-decorator\/","title":{"rendered":"PHP : un exemple simple de design pattern Decorator"},"content":{"rendered":"<p>Le design pattern Decorator (en fran\u00e7ais, <em>d\u00e9corateur<\/em>) a pour but d&rsquo;\u00e9tendre les fonctionnalit\u00e9s d&rsquo;un objet gr\u00e2ce \u00e0 l&rsquo;utilisation de l&rsquo;h\u00e9ritage.\u00a0Mon p\u00e8re m&rsquo;a toujours dit que d&rsquo;un \u00e2ne, on ne pouvait pas faire un cheval de course; je vais m&#8217;employer \u00e0 lui donner tort ! Voici un diagramme de classe qui sert de base \u00e0 notre exemple, je l&rsquo;ai r\u00e9alis\u00e9 avec l&rsquo;outil <a href=\"http:\/\/argouml.tigris.org\/\" target=\"_blank\">ArgoUML<\/a>\u00a0sur GNU\/LInux Debian :<\/p>\n<p><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/04\/Diagrammedeclasses.png\"><img loading=\"lazy\" class=\"alignnone size-full wp-image-176\" alt=\"Diagrammedeclasses\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/04\/Diagrammedeclasses.png\" width=\"564\" height=\"344\" srcset=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/04\/Diagrammedeclasses.png 564w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/04\/Diagrammedeclasses-300x182.png 300w\" sizes=\"(max-width: 564px) 100vw, 564px\" \/><\/a><\/p>\n<p>Au sommet de notre diagramme tr\u00f4ne fi\u00e8rement la classe abstraite <em>Equide<\/em> : elle poss\u00e8de une variable d&rsquo;instance prot\u00e9g\u00e9e de type cha\u00eene de caract\u00e8res qui stocke une description tr\u00e8s sommaire de l&rsquo;\u00e9quid\u00e9 ainsi que deux m\u00e9thodes dont une (donne Description) est abstraite. Voici son code en d\u00e9tail :<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n\r\nabstract class Equide {\r\n    protected $_description = '\u00e9quid\u00e9 commun';\r\n    abstract public function courir();\r\n\r\n    public function donneDescription() {\r\n        return $this-&gt;_description;\r\n    }\r\n}\r\n\r\n<\/pre>\n<p>Ce super-type est d\u00e9riv\u00e9 en deux classes concr\u00e8tes :<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n\r\nclass AneSauvage extends Equide {\r\n    public function __construct() {\r\n        $this-&gt;_description = '\u00e2ne sauvage';\r\n    }\r\n\r\n    public function courir() {\r\n        echo &quot;Il m'arrive de courir \u00e0 l'occasion...&quot;;\r\n    }\r\n}\r\n\r\nclass AneDomestique extends Equide {\r\n    public function __construct() {\r\n        $this-&gt;_description = '\u00e2ne domestique';\r\n    }\r\n\r\n    public function courir() {\r\n        echo &quot;Si vraiment on m'y oblige, je trotte...&quot;;\r\n    }\r\n}\r\n\r\n<\/pre>\n<p>La m\u00e9thode <em>courir<\/em>, signal\u00e9e abstraite dans la m\u00e8re est impl\u00e9ment\u00e9e dans les filles et la valeur par d\u00e9faut stock\u00e9e dans la variable d&rsquo;instance _description est \u00e9cras\u00e9e avec une valeur un peu plus cens\u00e9e lors de la construction de l&rsquo;objet.<\/p>\n<p>La nouveaut\u00e9 arrive maintenant&#8230;<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n\r\nabstract class DecorateurEquide extends Equide {\r\n    protected $_equide;\r\n\r\n    public function __construct(Equide $equide) {\r\n        $this-&gt;_equide = $equide;\r\n    }\r\n}\r\n\r\nclass ChevalDeCourse extends DecorateurEquide {\r\n\r\n    public function donneDescription() {\r\n        return $this-&gt;_equide-&gt;donneDescription() .\r\n               ' qui court tr\u00e8s tr\u00e8s vite !' . PHP_EOL;\r\n    }\r\n\r\n    public function courir() {\r\n        return $this-&gt;_equide-&gt;courir() .\r\n               ' et maintenant je galope tel un cheval de course !' .\r\n               PHP_EOL;\r\n    }\r\n}\r\n\r\n<\/pre>\n<p>Notre classe d\u00e9corateur est <em>DecorateurEquide<\/em>; voyez-le par vous-m\u00eames, c&rsquo;est une classe abstraite&#8230;il faudra donc la d\u00e9river. Cette classe prend en composition un objet de la classe <em>Equide<\/em>, puisque c&rsquo;est pr\u00e9cis\u00e9ment cet objet qu&rsquo;elle va d\u00e9corer ! C&rsquo;est lors de\u00a0l\u2019instanciation\u00a0d&rsquo;une de ses classes filles que l&rsquo;on passera notre instance d<em>&lsquo;Equide<\/em> au constructeur.<\/p>\n<p>La seule classe fille d&rsquo;<em>Equide<\/em> dans notre exemple est <em>ChevalDeCourse<\/em>; elle <strong>ajoute des fonctionnalit\u00e9s<\/strong> aux m\u00e9thodes\u00a0<em>courir<\/em> et <em>donneDescription<\/em> qui proviennent de <em>DecorateurEquide\u00a0<\/em>et donc de <em>Equide<\/em>. Dans ce cet exemple trivial ces fonctionnalit\u00e9s se r\u00e9sument \u00e0 une simple cha\u00eene de caract\u00e8res.<\/p>\n<p>Les d\u00e9corateurs ont le m\u00eame type que les objets qu&rsquo;ils d\u00e9corent, c&rsquo;est la raison pour laquelle <em>DecorateurEquide<\/em> h\u00e9rite d&rsquo;<em>Equide<\/em>, pour en \u00eatre un sous-type ! L&rsquo;h\u00e9ritage n&rsquo;est pas r\u00e9alis\u00e9 \u00e0 des fins \u00ab\u00a0comportementales\u00a0\u00bb mais simplement pour des raisons de typage. J&rsquo;ai mis la variable d&rsquo;instance _equide et le constructeur dans <em>DecorateurEquide<\/em> mais j&rsquo;aurais pu tout aussi bien laisser cette classe vide (ne m&rsquo;en servir <em>vraiment<\/em> que pour le typage) et d\u00e9porter ce code dans les classes concr\u00e8tes qui sp\u00e9cialisent (et sp\u00e9cialiseront \u00e0 terme)\u00a0<em>DecorateurEquide<\/em>. C&rsquo;est un choix de conception parmi d&rsquo;autres&#8230;<\/p>\n<p>Pour utiliser ce code :<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n\r\n$aneDomestique = new AneDomestique;\r\n$cheval = new ChevalDeCourse($aneDomestique);\r\n\r\necho $cheval-&gt;donneDescription();\r\necho $cheval-&gt;courir();\r\n\r\n<\/pre>\n<p>Tu vois Papa, c&rsquo;est bien la preuve que d&rsquo;un \u00e2ne, on peut faire un cheval de course !<\/p>\n<p><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/04\/smiling-donkey.jpg\"><img loading=\"lazy\" class=\"alignnone size-full wp-image-187\" alt=\"smiling donkey\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/04\/smiling-donkey.jpg\" width=\"335\" height=\"500\" srcset=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/04\/smiling-donkey.jpg 335w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/04\/smiling-donkey-201x300.jpg 201w\" sizes=\"(max-width: 335px) 100vw, 335px\" \/><\/a><\/p>\n<p>Source : blog <a href=\"http:\/\/terapiasnaturalesmaria.blogspot.fr\/\" target=\"_blank\">Terapias Naturales<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Le design pattern Decorator (en fran\u00e7ais, d\u00e9corateur) a pour but d&rsquo;\u00e9tendre les fonctionnalit\u00e9s d&rsquo;un objet gr\u00e2ce \u00e0 l&rsquo;utilisation de l&rsquo;h\u00e9ritage.\u00a0Mon p\u00e8re m&rsquo;a toujours dit que d&rsquo;un \u00e2ne, on ne pouvait pas faire un cheval de course; je vais m&#8217;employer \u00e0 lui donner tort ! Voici un diagramme de classe qui sert de base \u00e0 notre [&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,3],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.6.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>PHP : un exemple simple de design pattern Decorator - 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\/2013\/04\/php-un-exemple-simple-de-design-pattern-decorator\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PHP : un exemple simple de design pattern Decorator - La Fabrique de code - Tech blog\" \/>\n<meta property=\"og:description\" content=\"Le design pattern Decorator (en fran\u00e7ais, d\u00e9corateur) a pour but d&rsquo;\u00e9tendre les fonctionnalit\u00e9s d&rsquo;un objet gr\u00e2ce \u00e0 l&rsquo;utilisation de l&rsquo;h\u00e9ritage.\u00a0Mon p\u00e8re m&rsquo;a toujours dit que d&rsquo;un \u00e2ne, on ne pouvait pas faire un cheval de course; je vais m&#8217;employer \u00e0 lui donner tort ! Voici un diagramme de classe qui sert de base \u00e0 notre [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-un-exemple-simple-de-design-pattern-decorator\/\" \/>\n<meta property=\"og:site_name\" content=\"La Fabrique de code - Tech blog\" \/>\n<meta property=\"article:published_time\" content=\"2013-04-09T09:39:31+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/04\/Diagrammedeclasses.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=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-un-exemple-simple-de-design-pattern-decorator\/\",\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-un-exemple-simple-de-design-pattern-decorator\/\",\"name\":\"PHP : un exemple simple de design pattern Decorator - La Fabrique de code - Tech blog\",\"isPartOf\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#website\"},\"datePublished\":\"2013-04-09T09:39:31+00:00\",\"dateModified\":\"2013-04-09T09:39:31+00:00\",\"author\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162\"},\"breadcrumb\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-un-exemple-simple-de-design-pattern-decorator\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-un-exemple-simple-de-design-pattern-decorator\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-un-exemple-simple-de-design-pattern-decorator\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"http:\/\/www.lafabriquedecode.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PHP : un exemple simple de design pattern Decorator\"}]},{\"@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 : un exemple simple de design pattern Decorator - 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\/2013\/04\/php-un-exemple-simple-de-design-pattern-decorator\/","og_locale":"fr_FR","og_type":"article","og_title":"PHP : un exemple simple de design pattern Decorator - La Fabrique de code - Tech blog","og_description":"Le design pattern Decorator (en fran\u00e7ais, d\u00e9corateur) a pour but d&rsquo;\u00e9tendre les fonctionnalit\u00e9s d&rsquo;un objet gr\u00e2ce \u00e0 l&rsquo;utilisation de l&rsquo;h\u00e9ritage.\u00a0Mon p\u00e8re m&rsquo;a toujours dit que d&rsquo;un \u00e2ne, on ne pouvait pas faire un cheval de course; je vais m&#8217;employer \u00e0 lui donner tort ! Voici un diagramme de classe qui sert de base \u00e0 notre [&hellip;]","og_url":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-un-exemple-simple-de-design-pattern-decorator\/","og_site_name":"La Fabrique de code - Tech blog","article_published_time":"2013-04-09T09:39:31+00:00","og_image":[{"url":"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/04\/Diagrammedeclasses.png"}],"author":"admin","twitter_card":"summary","twitter_creator":"@LaFabrique2Code","twitter_site":"@LaFabrique2Code","twitter_misc":{"\u00c9crit par":"admin","Dur\u00e9e de lecture estim\u00e9e":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-un-exemple-simple-de-design-pattern-decorator\/","url":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-un-exemple-simple-de-design-pattern-decorator\/","name":"PHP : un exemple simple de design pattern Decorator - La Fabrique de code - Tech blog","isPartOf":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/#website"},"datePublished":"2013-04-09T09:39:31+00:00","dateModified":"2013-04-09T09:39:31+00:00","author":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162"},"breadcrumb":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-un-exemple-simple-de-design-pattern-decorator\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-un-exemple-simple-de-design-pattern-decorator\/"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-un-exemple-simple-de-design-pattern-decorator\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"http:\/\/www.lafabriquedecode.com\/blog\/"},{"@type":"ListItem","position":2,"name":"PHP : un exemple simple de design pattern Decorator"}]},{"@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\/174"}],"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=174"}],"version-history":[{"count":14,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/174\/revisions"}],"predecessor-version":[{"id":191,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/174\/revisions\/191"}],"wp:attachment":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/media?parent=174"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/categories?post=174"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/tags?post=174"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}