Exemples de code de mode de méthode de modèle de modèle de conception PHP (méthode de modèle) (31)

objectif

Le modèle de méthode de modèle est une stratégie de comportement qui permet à des sous-classes de modèles abstraits de «compléter» une série d'algorithmes.

Le fameux "Principe Hollywood": "Ne nous appelez pas, nous vous appellerons." Cette classe n'est pas appelée par des sous-classes, mais de manière opposée. Comment faire? Bien sûr, c'est très abstrait!

En d'autres termes, il s'agit d'un squelette d'algorithme qui convient très bien aux bibliothèques de framework. L'utilisateur doit uniquement implémenter une méthode de la sous-classe, et la classe parente peut faire le travail.

C'est un moyen simple de séparer les classes concrètes et peut réduire le copier-coller, ce qui en est également une raison courante.

Graphiques UML

★ Gestion officielle de "clic" de la communauté d'échange d'apprentissage avancé PHP pour organiser certains matériaux, BAT et d'autres entreprises de première ligne ont des systèmes de connaissances avancés (matériaux d'apprentissage pertinents et questions d'entretien écrites) et ne se limitent pas à: architecture distribuée, haute évolutivité, haute Performances, haute concurrence, réglage des performances du serveur, TP6, laravel, YII2, Redis, Swoole, Swoft, Kafka, optimisation Mysql, scripts shell, Docker, microservices, Nginx et autres points de connaissances, produits secs avancés avancés

Code

  • Journey.php

<?php

namespace DesignPatterns\Behavioral\TemplateMethod;

abstract class Journey
{
    /**
     * @var string[]
     */
    private $thingsToDo = [];

    /**
     * 这是当前类及其子类提供的公共服务
     * 注意,它「冻结」了全局的算法行为
     * 如果你想重写这个契约,只需要实现一个包含 takeATrip() 方法的接口
     */
    final public function takeATrip()
    {
        $this->thingsToDo[] = $this->buyAFlight();
        $this->thingsToDo[] = $this->takePlane();
        $this->thingsToDo[] = $this->enjoyVacation();
        $buyGift = $this->buyGift();

        if ($buyGift !== null) {
            $this->thingsToDo[] = $buyGift;
        }

        $this->thingsToDo[] = $this->takePlane();
    }

    /**
     * 这个方法必须要实现,它是这个模式的关键点
     */
    abstract protected function enjoyVacation(): string;

    /**
     * 这个方法是可选的,也可能作为算法的一部分
     * 如果需要的话你可以重写它
     *
     * @return null|string
     */
    protected function buyGift()
    {
        return null;
    }

    private function buyAFlight(): string
    {
        return 'Buy a flight ticket';
    }

    private function takePlane(): string
    {
        return 'Taking the plane';
    }

    /**
     * @return string[]
     */
    public function getThingsToDo(): array
    {
        return $this->thingsToDo;
    }
}
  • BeachJourney.php

<?php

namespace DesignPatterns\Behavioral\TemplateMethod;

class BeachJourney extends Journey
{
    protected function enjoyVacation(): string
    {
        return "Swimming and sun-bathing";
    }
}
  • CityJourney.php

<?php

namespace DesignPatterns\Behavioral\TemplateMethod;

class CityJourney extends Journey
{
    protected function enjoyVacation(): string
    {
        return "Eat, drink, take photos and sleep";
    }

    protected function buyGift(): string
    {
        return "Buy a gift";
    }
}

tester

  • Tests / JourneyTest.php

<?php

namespace DesignPatterns\Behavioral\TemplateMethod\Tests;

use DesignPatterns\Behavioral\TemplateMethod;
use PHPUnit\Framework\TestCase;

class JourneyTest extends TestCase
{
    public function testCanGetOnVacationOnTheBeach()
    {
        $beachJourney = new TemplateMethod\BeachJourney();
        $beachJourney->takeATrip();

        $this->assertEquals(
            ['Buy a flight ticket', 'Taking the plane', 'Swimming and sun-bathing', 'Taking the plane'],
            $beachJourney->getThingsToDo()
        );
    }

    public function testCanGetOnAJourneyToACity()
    {
        $cityJourney = new TemplateMethod\CityJourney();
        $cityJourney->takeATrip();

        $this->assertEquals(
            [
                'Buy a flight ticket',
                'Taking the plane',
                'Eat, drink, take photos and sleep',
                'Buy a gift',
                'Taking the plane'
            ],
            $cityJourney->getThingsToDo()
        );
    }
}

Le chemin de croissance de PHP Internet Architect * Le guide ultime des «modèles de conception»

Guide de croissance de PHP Internet Architect 50K + Guide de résolution des problèmes de l'industrie (mise à jour continue)

Entretien avec 10 entreprises, obtenez 9 offres, questions d'entretien PHP en 2020

★ Si vous aimez mon article et que vous souhaitez communiquer et apprendre avec des développeurs plus expérimentés, obtenir plus de conseils techniques et des conseils liés aux entretiens avec de grandes entreprises, bienvenue à rejoindre notre groupe, mot de passe: phpzh

Le dernier tutoriel avancé PHP en 2020, série complète!

Si le contenu est bon, j'espère que tout le monde vous soutiendra et vous encouragera à donner un `` like / like '' et à communiquer ensemble; de ​​plus, si vous avez des questions, vous pouvez suggérer ce que vous voulez voir dans les commentaires.

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43814458/article/details/108714191
conseillé
Classement