Maison > développement back-end > tutoriel php > Quel est le modèle d'état en PHP ? Apprenez-le à travers des exemples

Quel est le modèle d'état en PHP ? Apprenez-le à travers des exemples

青灯夜游
Libérer: 2023-04-10 12:00:02
avant
2162 Les gens l'ont consulté

Dans l'article précédent "Parlons du mode singleton en PHP", nous avons présenté le mode singleton en PHP. L'article suivant vous amènera à comprendre le mode état dans le modèle de conception PHP

Quel est le modèle d'état en PHP ? Apprenez-le à travers des exemples

state Le modèle est en fait. pas très facile à comprendre littéralement. Que signifie le statut ici ? Enregistrer le statut ? Ce n'est pas le mode mémo. En fait, l’état ici est l’état de la classe. En changeant un certain état de la classe, la classe ressemble à une classe différente. C’est un peu difficile à dire, alors apprenons d’abord le concept, puis lisons-le plus tard.

Diagramme de classe Gof et explication

Définition GoF : Permet à un objet de changer de comportement lorsque son état interne change. L'objet semble avoir modifié sa classe

Diagramme de classes GoF

Quel est le modèle détat en PHP ? Apprenez-le à travers des exemples

Implémentation du code

class Context
{
    private $state;
    public function SetState(State $state): void
    {
        $this->state = $state;
    }
    public function Request(): void
    {
        $this->state = $this->state->Handle();
    }
}
Copier après la connexion

Une classe de contexte, qui peut également être considérée comme une classe cible, contient un objet d'état. Lors de l’appel de Request(), appelez la méthode Handle() de la classe d’état. Le but est que les changements dans l’état actuel de la classe de contexte soient contrôlés par la classe d’état externe.

interface State
{
    public function Handle(): State;
}

class ConcreteStateA implements State
{
    public function Handle(): State
    {
        echo '当前是A状态', PHP_EOL;
        return new ConcreteStateB();
    }
}

class ConcreteStateB implements State
{
    public function Handle(): State
    {
        echo '当前是B状态', PHP_EOL;
        return new ConcreteStateA();
    }
}
Copier après la connexion

Interface d'état abstraite et deux implémentations concrètes. Ces deux implémentations spécifiques s'appellent en fait. L'effet de l'implémentation est que chaque fois que la classe de contexte appelle la méthode Request(), la classe d'état interne passe à un autre état. C'est comme un interrupteur qui bascule entre marche et arrêt.

$c = new Context();
$stateA = new ConcreteStateA();
$c->SetState($stateA);
$c->Request();
$c->Request();
$c->Request();
$c->Request();
Copier après la connexion

L'implémentation du client instancie l'objet contextuel et définit l'état initial, puis appelle en continu l'objet Request() pour atteindre l'état de commutation.

  • Vous voyez le chemin ? Ici, les changements d'état sont encapsulés dans la classe d'implémentation externe. Le changement d'état n'est pas effectué à l'intérieur du contexte ou de la classe cible. Alors, quelle est la signification du modèle d'état ? Cet exemple de diagramme de classes par défaut est trop simple.En fait, le véritable objectif du modèle d'état est de résoudre le problème d'imbrication complexe. Les conditions d'imbrication complexes sont placées une par une dans les classes d'état externes pour jugement. exemples suivants Nous verrons que
  • s'applique à : le comportement d'un objet dépend de son état, et il doit changer de comportement en fonction de l'état au moment de l'exécution ; une opération contient un grand nombre d'instructions conditionnelles multi-branches, et celles-ci les branches dépendent de l'état de l'objet ;
  • Les caractéristiques du modèle d'état sont : il localise le comportement lié à un état spécifique ; il rend les transitions d'état explicites ; les objets d'état peuvent être partagés
  • que l'on trouve couramment dans les systèmes d'ordre ; les systèmes d'adhésion et les systèmes OA, c'est-à-dire qu'il y aura divers changements de statut dans le processus, et le modèle de statut peut être utilisé pour la conception et l'architecture globales
Nous avons personnalisé notre propre système de centre commercial dans le système de téléphonie mobile, et vous pouvez facilement passer des commandes sur votre téléphone mobile. Achetez nos articles. Une commande (Contexte) aura plusieurs états (État), tels que non payée, payée, commande terminée, commande remboursée et de nombreux états. Nous mettons ces états dans les classes d'état correspondantes à mettre en œuvre. Différentes classes d'état appelleront la prochaine action de l'état, par exemple, après le paiement, attendez la réception de la marchandise, et après le remboursement, attendez que l'acheteur remplisse. le formulaire logistique. Attendez, de cette façon, le mode étatique peut être utilisé de manière flexible dans notre centre commercial ! !

Code complet : https://github.com/zhangyue0503/designpatterns-php/blob/master/22.state/source/state.php

Exemple

Les applications habituelles des centres commerciaux auront des membres En raison de Grâce à l'existence du système, les membres ayant des niveaux plus élevés peuvent généralement bénéficier de plus de réductions. À ce stade, vous pouvez facilement obtenir des réductions au niveau des membres en utilisant le mode statut. Bien sûr, la chose la plus importante est qu'en utilisant le mode statut, vous ne pouvez ajouter la sous-classe de statut de réduction de membre correspondante que lorsque vous devez ajouter ou supprimer un niveau d'adhésion. Aucun autre code métier ne doit être modifié, jetons un coup d'œil à l'implémentation spécifique !

Tableau des réductions pour les membres

Quel est le modèle détat en PHP ? Apprenez-le à travers des exemples

Code source complet : https://github.com/zhangyue0503/designpatterns-php/blob/master/22.state/source/state-member.php

<?php

class Member
{
    private $state;
    private $score;

    public function SetState($state)
    {
        $this->state = $state;
    }

    public function SetScore($score)
    {
        $this->score = $score;
    }

    public function GetScore()
    {
        return $this->score;
    }

    public function discount()
    {
        return $this->state->discount($this);
    }
}

interface State
{
    public function discount($member);
}

class PlatinumMemeberState implements State
{
    public function discount($member)
    {
        if ($member->GetScore() >= 1000) {
            return 0.80;
        } else {
            $member->SetState(new GoldMemberState());
            return $member->discount();
        }
    }
}

class GoldMemberState implements State
{
    public function discount($member)
    {
        if ($member->GetScore() >= 800) {
            return 0.85;
        } else {
            $member->SetState(new SilverMemberState());
            return $member->discount();
        }
    }
}

class SilverMemberState implements State
{
    public function discount($member)
    {
        if ($member->GetScore() >= 500) {
            return 0.90;
        } else {
            $member->SetState(new GeneralMemberState());
            return $member->discount();
        }
    }
}

class GeneralMemberState implements State
{
    public function discount($member)
    {
        return 0.95;
    }
}

$m = new Member();
$m->SetState(new PlatinumMemeberState());

$m->SetScore(1200);
echo &#39;当前会员&#39; . $m->GetScore() . &#39;积分,折扣为:&#39; . $m->discount(), PHP_EOL;

$m->SetScore(990);
echo &#39;当前会员&#39; . $m->GetScore() . &#39;积分,折扣为:&#39; . $m->discount(), PHP_EOL;

$m->SetScore(660);
echo &#39;当前会员&#39; . $m->GetScore() . &#39;积分,折扣为:&#39; . $m->discount(), PHP_EOL;

$m->SetScore(10);
echo &#39;当前会员&#39; . $m->GetScore() . &#39;积分,折扣为:&#39; . $m->discount(), PHP_EOL;
Copier après la connexion
Remarque

Si vous n'utilisez pas le mode état, dans la méthode Member's discount(), nous devrons peut-être écrire plusieurs couches de conditions de jugement if...else...
  • En même temps, cela aussi apporte de plus en plus d'expérience de méthode C'est un problème long et de plus en plus difficile à maintenir
  • Le modèle d'état existe pour résoudre ce problème
  • Lorsque le résultat du comportement discount() dépend de l'état de l'objet Member lui-même ( points d'adhésion), le modèle d'état est optimal Sélectionné, c'est-à-dire que le comportement d'un objet comme mentionné ci-dessus dépend de son statut
Adresse originale : https://juejin.cn/post/6844903991562731534

Auteur : Hardcore Project Gestionnaire

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!

Étiquettes associées:
source:juejin.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal