Maison  >  Article  >  développement back-end  >  Modèles de conception avancés orientés objet PHP : exemples d'utilisation de modèles de délégation

Modèles de conception avancés orientés objet PHP : exemples d'utilisation de modèles de délégation

巴扎黑
巴扎黑original
2017-05-22 14:07:492068parcourir

L'une des fonctionnalités les plus puissantes de la programmation orientée objet est sa nature dynamique. Dans un monde aux capacités toujours croissantes, aux structures de bâtiments hybrides et aux normes en évolution, le code dynamique prend une toute nouvelle signification. Qu'il s'agisse d'un nouveau standard de stockage de fichiers ou d'un standard de streaming, d'un site de réseautage social ou de quelque chose de nouveau avec une API pionnière d'Internet, la programmation Web est en constante évolution. Les méthodes traditionnelles de détermination de la peine ne sont plus efficaces aujourd’hui face au grand nombre d’options disponibles. En déplaçant les objets intelligents vers des emplacements appropriés, le modèle de conception délégué évite les décisions complexes.

Quel est le modèle de délégation ?

Le modèle de conception de délégation supprime les décisions et les fonctionnalités complexes de l'objet principal en attribuant ou en déléguant à d'autres objets.

Problèmes et solutions d'application des modèles de délégation

La plupart des programmeurs PHP sont initialement exposés à des types de programmation procédurale. Ce style de programmation s'appuie fortement sur le contrôle de flux basé sur des instructions conditionnelles. La programmation orientée objet offre des alternatives aux instructions conditionnelles traditionnelles, créant ainsi un flux de code plus dynamique. Une façon d’obtenir cette fonctionnalité consiste à créer des objets basés sur le modèle de conception délégué.

Le modèle de conception Delegate s'efforce de supprimer la complexité des objets principaux. À ce stade, nous ne concevons pas d'objets qui reposent fortement sur l'exécution de fonctionnalités spécifiques en évaluant des instructions conditionnelles. Les objets basés sur le modèle de délégation peuvent déléguer des décisions à différents objets. La délégation peut être aussi simple que l'utilisation d'un objet intermédiaire pour gérer un arbre de décision, ou aussi complexe que l'utilisation d'un objet instancié dynamiquement pour fournir la fonctionnalité souhaitée.

Il est très important de ne pas considérer le modèle de conception de délégué comme un concurrent direct des instructions conditionnelles. En revanche, le modèle de conception Delegate aide à structurer l'architecture en appelant la fonctionnalité correcte sans nécessiter d'instructions conditionnelles. L'instruction conditionnelle est mieux placée dans la méthode réelle et le traitement des règles métier est effectué dans la méthode.

Un exemple d'utilisation du modèle de conception Delegate consiste à fournir plusieurs formats pour une partie spécifique des données. Supposons qu'il existe une archive dans un référentiel de code open source. Lorsque les visiteurs ont l'intention de télécharger une partie du code source, ils peuvent choisir entre deux formats de fichiers différents. Le fichier spécifié sera compressé et envoyé au navigateur. Dans cet exemple, j'ai l'intention de prendre des fichiers aux formats compressés zip et tgz.

Lorsqu'un objet contient des éléments de fonctionnalités complexes mais indépendants qui doivent être exécutés en fonction de décisions, la meilleure pratique consiste à utiliser des objets basés sur le modèle de conception délégué.


UML

Ce diagramme UML détaille une conception de classe utilisant le modèle de conception de délégué.

Modèles de conception avancés orientés objet PHP : exemples dutilisation de modèles de délégationModèles de conception avancés orientés objet PHP : exemples dutilisation de modèles de délégation

Ce qui suit est une description de l'image ci-dessus :

1 La classe de base MyObject sait qu'elle utilisera des objets basés sur le délégué. modèle de conception. Cette classe contient la chaîne de caractères privée déléguéType et l'instance privée internalDelegate de MyDelegateObject.

2. La méthode setDelegateType() reçoit un paramètre nommé type, qui est stocké dans la chaîne déléguéType.

3. La méthode createDelegateObject() créera une instance de l'objet délégué et nommera l'instance en fonction de la variable déléguéType. Cette méthode stocke ensuite l'instance en interne en l'attribuant à internalDelegate.

4. La méthode runDelegateAction() est responsable de l'exécution de la méthode action() de l'objet internalDelegate.

5.MyDelegateObject contient la logique responsable d'actions spécifiques. MyObject exécute la méthode action() pour implémenter des fonctions spécifiques.

Scénario d'application

Conception d'une classe CD, qui a un mode de lecture mp3 et un mode de lecture mp4

Avant l'amélioration, le mode de lecture de la classe CD devait être utilisé dans l'instance

Après l'amélioration, le mode de lecture est passé dans la fonction playList en tant que paramètre, et la méthode correspondante à jouer peut être automatiquement trouvée.

Code : classe cd, avant amélioration, la sélection du mode de lecture était pénible

Exemple d'utilisation :

<?php  
//委托模式-去除核心对象中的判决和复杂的功能性  
//使用委托模式之前,调用cd类,选择cd播放模式是复杂的选择过程  
class cd {  
protected $cdInfo = array();   
 
public function addSong($song) {  
       $this->cdInfo[$song] = $song;  
}  
      
public function playMp3($song) {  
        return $this->cdInfo[$song] . &#39;.mp3&#39;;  
    }  
      
    public function playMp4($song) {  
        return $this->cdInfo[$song] . &#39;.mp4&#39;;  
    }  
}  
$oldCd = new cd;  
$oldCd->addSong("1");  
$oldCd->addSong("2");  
$oldCd->addSong("3");  
$type = &#39;mp3&#39;;  
if ($type == &#39;mp3&#39;) {  
    $oldCd->playMp3();  
} else {  
    $oldCd->playMp4();  
}

Code : via le mode délégation, après amélioration classe cd

<?php  
//委托模式-去除核心对象中的判决和复杂的功能性  
//改进cd类  
class cdDelegate {  
    protected $cdInfo = array();   
      
    public function addSong($song) {  
        $this->cdInfo[$song] = $song;  
    }  
      
    public function play($type, $song) {  
        $obj = new $type;  
        return $obj->playList($this->cdInfo, $song);  
    }  
}  
  
class mp3 {  
    public function playList($list) {  
        return $list[$song];  
    }  
}  
  
class mp4 {  
    public function playList($list) {          return $list[$song];  
    }  
}  
  
$newCd = new cd;  
$newCd->addSong("1");  
$newCd->addSong("2");  
$newCd->addSong("3");  
$type = &#39;mp3&#39;;  
$oldCd->play(&#39;mp3&#39;, &#39;1&#39;); //只要传递参数就能知道需要选择何种播放模式

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn