Maison  >  Article  >  développement back-end  >  Une analyse approfondie du modèle de méthode de modèle en PHP

Une analyse approfondie du modèle de méthode de modèle en PHP

青灯夜游
青灯夜游avant
2021-07-23 19:25:482306parcourir

Dans l'article précédent "Comprendre le modèle de façade en PHP dans un article", nous avons présenté le modèle de façade en PHP. Cet article vous amènera à comprendre le modèle de méthode de modèle dans le modèle de conception PHP.

Une analyse approfondie du modèle de méthode de modèle en PHP

Le modèle de méthode modèle est également l'un des modèles que nous utilisons souvent par inadvertance. Ce modèle est la meilleure interprétation de l'héritage. Lorsqu'il y a des actions répétées dans la sous-classe, elles sont extraites et placées dans la classe parent pour un traitement unifié. Il s'agit de l'explication la plus simple et la plus populaire du modèle de méthode modèle. Tout comme lorsque nous réalisons habituellement des projets, le processus de chaque projet est en fait le même, y compris les processus de recherche, de développement, de test, de déploiement et en ligne. Dans chaque projet, la mise en œuvre de ces processus ne sera pas exactement la même. Ce processus est comme une méthode modèle, nous permettant de développer à chaque fois selon ce processus.

Diagramme de classes Gof et explication

Définition GoF : Définir le squelette d'un algorithme dans une opération, tout en reportant certaines étapes aux sous-classes. TemplateMethod permet aux sous-classes de redéfinir des étapes spécifiques d'un algorithme sans modifier la structure de l'algorithme.

Diagramme de classes GoF

Une analyse approfondie du modèle de méthode de modèle en PHP

Implémentation du code

abstract class AbstractClass
{
    public function TemplateMethod()
    {
        $this->PrimitiveOperation1();
        $this->PrimitiveOperation2();
    }

    abstract public function PrimitiveOperation1();
    abstract public function PrimitiveOperation2();
}

Définissez une classe abstraite avec une méthode modèle TemplateMethod(), dans laquelle nous appelons la méthode d'opération de l'algorithme. Ces méthodes abstraites d’algorithmes sont implémentées dans des sous-classes.

class ConcreteClassA extends AbstractClass
{
    public function PrimitiveOperation1()
    {
        echo '具体类A实现方法1', PHP_EOL;
    }
    public function PrimitiveOperation2()
    {
        echo '具体类A实现方法2', PHP_EOL;
    }
}

class ConcreteClassB extends AbstractClass
{
    public function PrimitiveOperation1()
    {
        echo '具体类B实现方法1', PHP_EOL;
    }
    public function PrimitiveOperation2()
    {
        echo '具体类B实现方法2', PHP_EOL;
    }
}

Classes d'implémentation spécifiques, elles n'ont besoin que d'implémenter l'algorithme défini par la classe parent.

$c = new ConcreteClassA();
$c->TemplateMethod();

$c = new ConcreteClassB();
$c->TemplateMethod();

Dans l'appel du client, la sous-classe est instanciée, mais la méthode modèle de la classe parent héritée par la sous-classe est appelée. Des appels d'algorithmes unifiés peuvent être réalisés.

  • Je crois que quiconque a fait du développement orienté objet aura utilisé dans une certaine mesure le modèle de méthode modèle. Parce que c'est très courant
  • Dans certains frameworks, certaines classes fonctionnelles ont souvent la fonction d'initialisation, et de nombreuses autres fonctions internes sont appelées dans la fonction d'initialisation. Il s'agit en fait d'une application du modèle de méthode modèle
  • Le modèle de méthode modèle Hook. les fonctions peuvent être facilement mises en œuvre. Tout comme de nombreux modèles ou fonctions de hook préparés pour vous dans les systèmes open source. Par exemple, certains programmes de blog open source réserveront des espaces publicitaires ou des fonctions de hook dans des emplacements spéciaux pour que les utilisateurs puissent les implémenter à la demande. Le modèle de méthode modèle convient pour : implémenter les parties constantes d'un algorithme en une seule fois et convertir les parties variables. à la sous-classe pour l'implémenter ; extraire les comportements courants dans la sous-classe et les concentrer dans la classe parent ; contrôler l'extension de la sous-classe ;
  • Ce modèle incarne un principe appelé "Loi d'Hollywood", qui est "Ne regardez pas" pour nous, nous venons à vous »
Dans l'entreprise, je recommande fortement la gestion de projet agile. Bien sûr, cela ne veut pas dire que la gestion de projet traditionnelle est mauvaise, mais l'agilité est plus adaptée à un travail plat et à court terme. et une entreprise rapide comme la nôtre. En agile, nous utilisons le framework Scurm, qui est en fait un modèle. Il définit quatre types de réunions, trois types de personnes et trois outils. Dans la mise en œuvre spécifique de chaque projet, nous respecterons ces règles, mais la mise en œuvre spécifique ne sera pas la même. Par exemple, parfois nous répétons une fois par semaine, et parfois nous répétons une fois par mois. Parfois, nous n'avons pas besoin d'une réunion rétrospective, mais nous organisons ensemble les réunions de rétrospective et de révision. Quoi qu’il en soit, nous réaliserons un développement de projet flexible basé sur Scurm. En tant que leader, il me suffit de rappeler le processus de base de Scurm dans chaque projet. La force de l’entreprise est donc indissociable de l’apprentissage de chacun. Bien sûr, les choses utiles doivent être apprises, partagées et appliquées à tout moment ! !

Code complet : https://github.com/zhangyue0503/designpatterns-php/blob/master/20.template-method/source/template-method.php

Example

Plus de SMS, cette fois, nous avons implémenté la partie initialisation d'une classe Cache. Tout comme les classes d'outils dans certains frameworks mentionnés ci-dessus. Généralement, nous utiliserons Memcached ou Redis pour implémenter Cache, nous extrayons donc une classe Cache publique, puis laissons les classes d'implémentation Cache de Memcached et Redis en hériter. Dans la classe publique, certains travaux d'initialisation de la classe d'implémentation sont effectués via des méthodes modèles. Ces tâches sont appelées uniformément par la classe parent. La classe d'implémentation n'a besoin que d'implémenter le contenu spécifique de chaque étape.

Diagramme des classes de cache

Une analyse approfondie du modèle de méthode de modèle en PHP

Code source complet : https://github.com/zhangyue0503/designpatterns-php/blob/master/20.template-method/source/template-method-cache.php

<?php

abstract class Cache
{
    private $config;
    private $conn;

    public function __construct()
    {
        $this->init();
    }
    public function init()
    {
        $this->GetConfig();
        $this->OpenConnection();
        $this->CheckConnection();
    }

    abstract public function GetConfig();
    abstract public function OpenConnection();
    abstract public function CheckConnection();
}

class MemcachedCache extends Cache
{
    public function GetConfig()
    {
        echo &#39;获取Memcached配置文件!&#39;, PHP_EOL;
        $this->config = &#39;memcached&#39;;
    }
    public function OpenConnection()
    {
        echo &#39;链接memcached!&#39;, PHP_EOL;
        $this->conn = 1;
    }
    public function CheckConnection()
    {
        if ($this->conn) {
            echo &#39;Memcached连接成功!&#39;, PHP_EOL;
        } else {
            echo &#39;Memcached连接失败,请检查配置项!&#39;, PHP_EOL;
        }
    }
}

class RedisCache extends Cache
{
    public function GetConfig()
    {
        echo &#39;获取Redis配置文件!&#39;, PHP_EOL;
        $this->config = &#39;redis&#39;;
    }
    public function OpenConnection()
    {
        echo &#39;链接redis!&#39;, PHP_EOL;
        $this->conn = 0;
    }
    public function CheckConnection()
    {
        if ($this->conn) {
            echo &#39;Redis连接成功!&#39;, PHP_EOL;
        } else {
            echo &#39;Redis连接失败,请检查配置项!&#39;, PHP_EOL;
        }
    }
}

$m = new MemcachedCache();

$r = new RedisCache();

Description

  • Nous avons implémenté une classe de cache si simple. Est-ce très similaire au code de nombreux frameworks ?
  • Les sous-classes doivent uniquement définir leur propre implémentation, et le reste du code répétitif est laissé à la classe parente, elles doivent toutes implémenter elles-mêmes une méthode init()
  • Bien sûr, d'autres implémentations. doit être ajouté, il vous suffit d'hériter de la classe parent Cache et de compléter votre propre implémentation. Les clients peuvent faire face à ces classes d'implémentation très facilement, car ils savent qu'ils n'ont besoin que d'appeler d'abord la méthode d'initialisation pour utiliser cette classe, peu importe. Quelle classe d'implémentation est la même

Adresse originale : https://juejin.cn/post/6844903989348139021

Auteur : Hardcore Project Manager

Apprentissage recommandé : "Tutoriel vidéo PHP"

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer