{"id":192,"date":"2013-04-10T10:12:59","date_gmt":"2013-04-10T08:12:59","guid":{"rendered":"http:\/\/www.lafabriquedecode.com\/blog\/?p=192"},"modified":"2019-02-03T14:05:42","modified_gmt":"2019-02-03T12:05:42","slug":"php-un-exemple-simple-du-design-pattern-template-method","status":"publish","type":"post","link":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-un-exemple-simple-du-design-pattern-template-method\/","title":{"rendered":"PHP : un exemple simple du design pattern Template Method"},"content":{"rendered":"<p>Vous cherchiez un design pattern facile \u00e0 aborder ? Le design pattern <em>template method<\/em> est celui qu&rsquo;il vous faut ! Son principe est tr\u00e8s simple : dans une classe, une m\u00e9thode dite <em>template<\/em>\u00a0est compos\u00e9e de sous-m\u00e9thodes dont on sait que chaque sous-classe l&rsquo;impl\u00e9mentera \u00e0 sa mani\u00e8re. Ces sous-m\u00e9thodes sont g\u00e9n\u00e9ralement en type d&rsquo;acc\u00e8s <em>prot\u00e9g\u00e9<\/em> car invoqu\u00e9es uniquement par cette fameuse m\u00e9thode <em>template<\/em>; l&rsquo;ext\u00e9rieur n&rsquo;a pas \u00e0 conna\u00eetre les myst\u00e8res de votre impl\u00e9mentation (encapsulation, vous d\u00eetes ?). Bien entendu, \u00e9tant donn\u00e9 que chaque classe fille impl\u00e9mentera ces m\u00e9thodes comme bon lui semble, il convient de les signifier comme <em>abstraites<\/em> dans la classe m\u00e8re.<\/p>\n<p>Imaginons une classe <strong>TunnelCommande<\/strong> qui expose une m\u00e9thode <em>template<\/em> nomm\u00e9e <strong>finaliserCommande<\/strong>; cette m\u00e9thode d\u00e9crit un algorithme en sp\u00e9cifiant ce qui devra \u00eatre fait par ses sous-classes et dans quel ordre. Cette classe comporte la m\u00e9thode <em>payePort<\/em> dite \u00ab\u00a0adaptateur\u00a0\u00bb (<em>hook<\/em>) qui peut \u00eatre r\u00e9\u00e9crite dans les classes filles. Elle sert \u00e0 conditionner une partie du flot d&rsquo;ex\u00e9cution de l&rsquo;algorithme de la m\u00e9thode <em>template<\/em>. Son utilit\u00e9 dans notre cas est de permettre \u00e0 un certain type d&rsquo;utilisateur de s&rsquo;affranchir du paiement des frais de port.<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\nabstract class TunnelCommande\r\n{\r\n    public function finaliserCommande(): void\r\n    {\r\n        $this-&gt;faireTotal();\r\n        \r\n        if ($this-&gt;payePort()) {\r\n            $this-&gt;ajouterFraisPort();\r\n        }\r\n\r\n        $this-&gt;rediriger('page_paiement');\r\n    }\r\n\r\n    public function payePort(): bool\r\n    {\r\n    \treturn true;\r\n    }\r\n\r\n    public function rediriger(string $template): void\r\n    {\r\n    \techo &quot;Redirection vers &quot;, $template, PHP_EOL;\r\n    }\r\n\r\n    abstract protected function faireTotal(): void;\r\n    abstract protected function ajouterFraisPort(): void;\r\n}\r\n<\/pre>\n<p>Nous avons deux classes concr\u00e8tes qui d\u00e9rivent <em>TunnelCommande<\/em> et impl\u00e9mentent les m\u00e9thodes abstraites en leur donnant un comportement sp\u00e9cifique. Dans <strong>CommandePremium<\/strong>, la m\u00e9thode <em>ajouterFraisPort<\/em> qui est impos\u00e9e par la classe m\u00e8re abstraite ne fait rien, <em>payePort<\/em> renvoyant <em>false<\/em> elle ne sera de toutes fa\u00e7ons jamais invoqu\u00e9e dans ce sc\u00e9nario l\u00e0.<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n\r\nclass CommandeClient extends TunnelCommande\r\n{\r\n    protected function faireTotal(): void\r\n    {\r\n        echo &quot;Je fais le total&quot;, PHP_EOL;\r\n    }\r\n\r\n    protected function ajouterFraisPort(): void \r\n    {\r\n        echo &quot;J'applique les frais de port du client normal&quot;, PHP_EOL;\r\n    }\r\n}\r\n\r\nclass CommandePremium extends TunnelCommande\r\n{\r\n    protected function faireTotal(): void\r\n    {\r\n        echo &quot;Appliquer 5% de rabais pour les clients Premium&quot;, PHP_EOL;\r\n    }\r\n\r\n    protected function ajouterFraisPort(): void\r\n    {\r\n        return;\r\n    }\r\n\r\n    public function payePort(): bool\r\n    {\r\n    \treturn false;\r\n    }\r\n}\r\n\r\n$premium = new CommandePremium;\r\n$premium-&gt;finaliserCommande();\r\n\r\n$standard = new CommandeClient;\r\n$standard-&gt;finaliserCommande();\r\n\r\n<\/pre>\n<p>Dans ce design pattern, tout le travail est fait dans la classe m\u00e8re, abstraite. Quand je dis \u00ab\u00a0tout le travail\u00a0\u00bb, je parle de la structure g\u00e9n\u00e9rale de l&rsquo;algorithme, de l&rsquo;ordre des op\u00e9rations. Evidemment, la responsabilit\u00e9 de l&rsquo;impl\u00e9mentation des d\u00e9tails de cet algorithme \u00ab\u00a0g\u00e9n\u00e9ral\u00a0\u00bb est d\u00e9l\u00e9gu\u00e9e aux classes d\u00e9riv\u00e9es, via le m\u00e9canisme d&rsquo;abstraction.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vous cherchiez un design pattern facile \u00e0 aborder ? Le design pattern template method est celui qu&rsquo;il vous faut ! Son principe est tr\u00e8s simple : dans une classe, une m\u00e9thode dite template\u00a0est compos\u00e9e de sous-m\u00e9thodes dont on sait que chaque sous-classe l&rsquo;impl\u00e9mentera \u00e0 sa mani\u00e8re. Ces sous-m\u00e9thodes sont g\u00e9n\u00e9ralement en type d&rsquo;acc\u00e8s prot\u00e9g\u00e9 car [&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,88,29],"tags":[99,43,4,98],"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 du design pattern Template Method - 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-du-design-pattern-template-method\/\" \/>\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 du design pattern Template Method - La Fabrique de code - Tech blog\" \/>\n<meta property=\"og:description\" content=\"Vous cherchiez un design pattern facile \u00e0 aborder ? Le design pattern template method est celui qu&rsquo;il vous faut ! Son principe est tr\u00e8s simple : dans une classe, une m\u00e9thode dite template\u00a0est compos\u00e9e de sous-m\u00e9thodes dont on sait que chaque sous-classe l&rsquo;impl\u00e9mentera \u00e0 sa mani\u00e8re. Ces sous-m\u00e9thodes sont g\u00e9n\u00e9ralement en type d&rsquo;acc\u00e8s prot\u00e9g\u00e9 car [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-un-exemple-simple-du-design-pattern-template-method\/\" \/>\n<meta property=\"og:site_name\" content=\"La Fabrique de code - Tech blog\" \/>\n<meta property=\"article:published_time\" content=\"2013-04-10T08:12:59+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-02-03T12:05:42+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=\"2 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-du-design-pattern-template-method\/\",\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-un-exemple-simple-du-design-pattern-template-method\/\",\"name\":\"PHP : un exemple simple du design pattern Template Method - La Fabrique de code - Tech blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.lafabriquedecode.com\/blog\/#website\"},\"datePublished\":\"2013-04-10T08:12:59+00:00\",\"dateModified\":\"2019-02-03T12:05:42+00:00\",\"author\":{\"@id\":\"https:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162\"},\"breadcrumb\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-un-exemple-simple-du-design-pattern-template-method\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-un-exemple-simple-du-design-pattern-template-method\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-un-exemple-simple-du-design-pattern-template-method\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.lafabriquedecode.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PHP : un exemple simple du design pattern Template Method\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.lafabriquedecode.com\/blog\/#website\",\"url\":\"https:\/\/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\":\"https:\/\/www.lafabriquedecode.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/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 du design pattern Template Method - 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-du-design-pattern-template-method\/","og_locale":"fr_FR","og_type":"article","og_title":"PHP : un exemple simple du design pattern Template Method - La Fabrique de code - Tech blog","og_description":"Vous cherchiez un design pattern facile \u00e0 aborder ? Le design pattern template method est celui qu&rsquo;il vous faut ! Son principe est tr\u00e8s simple : dans une classe, une m\u00e9thode dite template\u00a0est compos\u00e9e de sous-m\u00e9thodes dont on sait que chaque sous-classe l&rsquo;impl\u00e9mentera \u00e0 sa mani\u00e8re. Ces sous-m\u00e9thodes sont g\u00e9n\u00e9ralement en type d&rsquo;acc\u00e8s prot\u00e9g\u00e9 car [&hellip;]","og_url":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-un-exemple-simple-du-design-pattern-template-method\/","og_site_name":"La Fabrique de code - Tech blog","article_published_time":"2013-04-10T08:12:59+00:00","article_modified_time":"2019-02-03T12:05:42+00:00","author":"admin","twitter_card":"summary","twitter_creator":"@LaFabrique2Code","twitter_site":"@LaFabrique2Code","twitter_misc":{"\u00c9crit par":"admin","Dur\u00e9e de lecture estim\u00e9e":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-un-exemple-simple-du-design-pattern-template-method\/","url":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-un-exemple-simple-du-design-pattern-template-method\/","name":"PHP : un exemple simple du design pattern Template Method - La Fabrique de code - Tech blog","isPartOf":{"@id":"https:\/\/www.lafabriquedecode.com\/blog\/#website"},"datePublished":"2013-04-10T08:12:59+00:00","dateModified":"2019-02-03T12:05:42+00:00","author":{"@id":"https:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162"},"breadcrumb":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-un-exemple-simple-du-design-pattern-template-method\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-un-exemple-simple-du-design-pattern-template-method\/"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-un-exemple-simple-du-design-pattern-template-method\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.lafabriquedecode.com\/blog\/"},{"@type":"ListItem","position":2,"name":"PHP : un exemple simple du design pattern Template Method"}]},{"@type":"WebSite","@id":"https:\/\/www.lafabriquedecode.com\/blog\/#website","url":"https:\/\/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":"https:\/\/www.lafabriquedecode.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"https:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162","name":"admin","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/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\/192"}],"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=192"}],"version-history":[{"count":18,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/192\/revisions"}],"predecessor-version":[{"id":1158,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/192\/revisions\/1158"}],"wp:attachment":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/media?parent=192"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/categories?post=192"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/tags?post=192"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}