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
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.
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
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(); } }
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(); } }
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();
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.
Code complet : https://github.com/zhangyue0503/designpatterns-php/blob/master/22.state/source/state.php
Exemple
Code source complet : https://github.com/zhangyue0503/designpatterns-php/blob/master/22.state/source/state-member.php
Remarque<?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 '当前会员' . $m->GetScore() . '积分,折扣为:' . $m->discount(), PHP_EOL; $m->SetScore(990); echo '当前会员' . $m->GetScore() . '积分,折扣为:' . $m->discount(), PHP_EOL; $m->SetScore(660); echo '当前会员' . $m->GetScore() . '积分,折扣为:' . $m->discount(), PHP_EOL; $m->SetScore(10); echo '当前会员' . $m->GetScore() . '积分,折扣为:' . $m->discount(), PHP_EOL;Copier après la connexionSi 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...
Adresse originale : https://juejin.cn/post/6844903991562731534
- 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
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!