Dans l'article précédent "Analyse approfondie du modèle de générateur en PHP", nous avons présenté le modèle de générateur en PHP. Cet article vous amènera à comprendre le modèle de mémo dans le modèle de conception PHP.
Mémo, le nom explique en fait sa fonction de manière très vivante. Un exemple typique est la fonction d'archive lorsque nous jouions à l'origine à des jeux sur disque dur. Lorsque vous vous inquiétez du grand BOSS que vous êtes sur le point d'affronter, vous enregistrez généralement d'abord une archive de progression. Si le défi échoue, vous pouvez lire directement l'archive pour restaurer l'état avant de défier le BOSS. Vous pourrez ensuite vous entraîner avec plaisir pendant un moment et revenir pour résoudre le grand BOSS. Cependant, juste au cas où, c'est toujours une bonne idée de sauvegarder un fichier avant de défier le BOSS. Un autre exemple est Git ou Svn, les outils de gestion de code que nous, programmeurs, utilisons quotidiennement. Chaque soumission est comme une sauvegarde d'archive. Lorsqu'il y a un problème avec le nouveau code, il suffit de revenir en arrière et de récupérer. Ce sont toutes des applications typiques du mode mémo. Examinons ensemble ce mode.
Définition GoF : Capturez l'état interne d'un objet et enregistrez cet état à l'extérieur de l'objet sans détruire l'encapsulation. De cette façon, l'objet peut être restauré à son état d'origine enregistré à l'avenir
Diagramme de classes GoF :
Implémentation du code :
class Originator { private $state; public function SetMeneto(Memento $m) { $this->state = $m->GetState(); } public function CreateMemento() { $m = new Memento(); $m->SetState($this->state); return $m; } public function SetState($state) { $this->state = $state; } public function ShowState() { echo $this->state, PHP_EOL; } }
L'auteur peut également être appelé l'initiateur. Il possède un état interne qui peut changer dans différentes circonstances. Lorsqu’un événement survient, cet état doit être restauré à son état d’origine. Ici, nous avons un CreateMemento() pour créer un mémo (archive) et un SetMeneto() pour restaurer l'état (lecture du fichier).
class Memento { private $state; public function SetState($state) { $this->state = $state; } public function GetState() { return $this->state; } }
Memo, très simple, sert à enregistrer le statut. La sauvegarde de cet état sous la forme d'un objet permet à l'auteur de créer facilement de nombreuses archives pour enregistrer différents états.
class Caretaker { private $memento; public function SetMemento($memento) { $this->memento = $memento; } public function GetMemento() { return $this->memento; } }
Le responsable, également appelé classe manager, enregistre le mémo et le sort d'ici en cas de besoin. Il est uniquement responsable de la sauvegarde et ne peut pas modifier le mémo. Dans les applications complexes, cela peut être transformé en liste, tout comme un jeu qui peut afficher de manière sélective plusieurs enregistrements d'archives parmi lesquels les joueurs peuvent choisir.
$o = new Originator(); $o->SetState('状态1'); $o->ShowState(); // 保存状态 $c = new Caretaker(); $c->SetMemento($o->CreateMemento()); $o->SetState('状态2'); $o->ShowState(); // 还原状态 $o->SetMeneto($c->GetMemento()); $o->ShowState();
Lors de l'appel du client, notre expéditeur a initialisé l'état et l'a enregistré, puis a artificiellement modifié l'état. À ce stade, il vous suffit de restaurer le statut par l'intermédiaire du responsable.
Code complet : https://github.com/zhangyue0503/designpatterns-php/blob/master/17.memento/source/memento.php
Exemple
Code source complet : https://github.com/zhangyue0503/designpatterns-php/blob/master/17.memento/source/memento-message.php
<?php class Message { private $content; private $to; private $state; private $time; public function __construct($to, $content) { $this->to = $to; $this->content = $content; $this->state = '未发送'; $this->time = time(); } public function Show() { echo $this->to, '---', $this->content, '---', $this->time, '---', $this->state, PHP_EOL; } public function CreateSaveSate() { $ss = new SaveState(); $ss->SetState($this->state); return $ss; } public function SetSaveState($ss) { if ($this->state != $ss->GetState()) { $this->time = time(); } $this->state = $ss->GetState(); } public function SetState($state) { $this->state = $state; } public function GetState() { return $this->state; } } class SaveState { private $state; public function SetState($state) { $this->state = $state; } public function GetState() { return $this->state; } } class StateContainer { private $ss; public function SetSaveState($ss) { $this->ss = $ss; } public function GetSaveState() { return $this->ss; } } // 模拟短信发送 $mList = []; $scList = []; for ($i = 0; $i < 10; $i++) { $m = new Message('手机号' . $i, '内容' . $i); echo '初始状态:'; $m->Show(); // 保存初始信息 $sc = new StateContainer(); $sc->SetSaveState($m->CreateSaveSate()); $scList[] = $sc; // 模拟短信发送,2发送成功,3发送失败 $pushState = mt_rand(2, 3); $m->SetState($pushState == 2 ? '发送成功' : '发送失败'); echo '发布后状态:'; $m->Show(); $mList[] = $m; } // 模拟另一个线程查找发送失败的并把它们还原到未发送状态 sleep(2); foreach ($mList as $k => $m) { if ($m->GetState() == '发送失败') { // 如果是发送失败的,还原状态 $m->SetSaveState($scList[$k]->GetSaveState()); } echo '查询发布失败后状态:'; $m->Show(); }
说明
原文地址:https://juejin.cn/post/6844903983555805192
作者:硬核项目经理
推荐学习:《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!