Le Design Pattern patron de méthode (Template Method) en PHP

Dans cet article nous allons aborder une autre prose de la programmation objet : le modèle de conception « Patron de méthode » (Template method).

Ce pattern (fréquemment utilisé dans les classes abstraites) propose de développer un algorithme basé sur des primitives que l’on trouvera uniquement dans les classes filles.

Dans notre exemple nous allons développer un système de validation de données basique qui met en avant ce modèle.

interface IValidator {
   public function assert ($pValue);
}

abstract class AbstractValidator implements IValidator  {
    /**
     * La "template method"
     * 
     * la fonction vérifie que $pValue est correcte, 
     *    lève  une exception sinon
     */
    public function assert ($pValue){
        if (($result = $this->_validate ($pValue)) !== true){
            throw new Exception (
                'Erreur de validation de donnée '.
                (is_array($result) ? implode(',', $result) : $result)
            );
        }
        return true;
    }
	
    /**
     * Fonction "primitive" faisant parti de l’algorithme 
     *   que les fils devront implémenter
     *
     * @return true|mixed $pValue true en cas de succès, 
     *   un tableau ou une chaine de caractère sinon, qui 
     *   contiendra le ou les messages d'erreur
     */
    abstract protected function _validate ($pValue);
}

L’exemple est ici particulièrement simple avec un patron de méthode qui se base sur une seule primitive. Il est bien sûr possible de trouver des formes plus complexes mettant en oeuvre X primitives.

Déclinaison de l’algorithme

Nous pouvons maintenant décliner l’algorithme sur plusieurs tâches comme vérifier que l’élément donné est un tableau, un objet, … ou n’importe quel type de donnée complexe à valider comme un compte épargne créditeur.

class ValidatorObject extends AbstractValidator {
   protected function _validate ($pValue){
      return is_object($pValue) ? true : 'La valeur n\'est pas un objet';
   }
}

class ValidatorArray extends AbstractValidator {
   protected function _validate ($pValue){
      return is_array($pValue) ? true : 'La valeur n\'est pas un tableau';
   }
}

class ValidatorCompteEpargneCrediteur extends AbstractValidator {
   protected function _validate ($pValue){
      if (is_object($pValue)){
         if ($pValue instanceof ICompteEpargne){
            if ($pValue->getSolde () > 0){
               return true;
            }
         }
      }
      return 'Ce n\est pas un compte épargne au solde créditeur';
   }
}

//Pour la forme, un code exemple d'appel
$validator = new ValidatorCompteEpargneCrediteur();
$validator->assert(new StdClass());//lancera une exception

7 réflexions au sujet de « Le Design Pattern patron de méthode (Template Method) en PHP »

  1. Ping : La Stratégie (Strategy) en PHP | Gerald's Blog

  2. Ping : Tweets that mention Les patrons de méthode (Template Method) en PHP | Gerald's Blog -- Topsy.com

  3. Ping : Les patrons de méthode Template Method en PHP | développement id="web" class="php jQuery" />

  4. Bonjour,

    D’abord merci pour l’article qui résume de façon simple et très abordable le pattern.

    La méthode assert de la classe abstraite ne devrait-elle pas être déclarée en final pour éviter que les sous-classes ne puissent la redéfinir et donc qu’elle garde (précieusement) la logique métier ?

    Pour aller plus loin :
    On peut également déclarer des méthodes non abstraites (vide ou avec une logique par défaut) dans la classe abstraite, de cette manière les sous-classes pourront à souhait les redéfinir ou pas.

    ++
    2ShEp

  5. Thank you for that smart critique. Me & my neighbour were preparing to do some research about that. We received a very good book on that matter from our local library and most books exactly where not as influensive as your information. Im quite glad to see this kind of information which I was searching for a long time.

  6. You really make it appear really easy together with your
    presentation however I in finding this matter to be really one thing which I think
    I might never understand. It sort of feels too complex and extremely extensive for me.
    I’m having a look ahead to your next post, I will attempt to get the cling of it!

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *