Im vorherigen Artikel „Eingehende Analyse des Builder-Musters in PHP“ haben wir das Builder-Muster in PHP vorgestellt. Dieser Artikel führt Sie zum Verständnis des Memo-Musters im PHP-Designmuster.
Memo, der Name erklärt seine Funktion tatsächlich sehr anschaulich. Ein typisches Beispiel ist die Archivfunktion, als wir ursprünglich Festplattenspiele spielten. Wenn Sie sich Sorgen über den großen BOSS machen, dem Sie gegenüberstehen, speichern Sie normalerweise zuerst ein Fortschrittsarchiv. Wenn die Herausforderung fehlschlägt, können Sie das Archiv direkt lesen, um den Zustand wiederherzustellen, bevor Sie den BOSS herausfordern. Anschließend können Sie eine Weile üben und dann zurückkommen, um den großen BOSS zu lösen. Für alle Fälle ist es jedoch immer eine gute Idee, eine Datei zu speichern, bevor Sie den BOSS herausfordern. Ein weiteres Beispiel sind Git oder Svn, die Codeverwaltungstools, die wir Programmierer täglich verwenden. Jede Übermittlung ist wie eine Archivsicherung. Wenn es ein Problem mit dem neuen Code gibt, führen Sie einfach einen Rollback durch und führen Sie eine Wiederherstellung durch. Dies sind alles typische Anwendungen des Memomodus. Schauen wir uns diesen Modus gemeinsam an.
GoF-Definition: Erfassen Sie den internen Zustand eines Objekts und speichern Sie diesen Zustand außerhalb des Objekts, ohne die Kapselung zu zerstören. Auf diese Weise kann das Objekt in Zukunft in seinen ursprünglichen gespeicherten Zustand zurückversetzt werden. Es verfügt über einen internen Zustand, der sich unter verschiedenen Umständen ändern kann. Wenn ein Ereignis eintritt, muss dieser Zustand in seinen ursprünglichen Zustand zurückversetzt werden. Hier haben wir ein CreateMemento() zum Erstellen eines Memos (Archiv) und ein SetMeneto() zum Wiederherstellen des Status (Lesen der Datei). 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;
}
}
class Memento { private $state; public function SetState($state) { $this->state = $state; } public function GetState() { return $this->state; } }
Die verantwortliche Person, auch Managerklasse genannt, speichert das Memo und holt es bei Bedarf von hier aus heraus. Es ist nur für das Speichern verantwortlich und kann das Memo nicht ändern. In komplexen Anwendungen kann dies in eine Liste umgewandelt werden, genau wie in einem Spiel, das selektiv mehrere Archivdatensätze anzeigen kann, aus denen Spieler auswählen können. class Caretaker
{
private $memento;
public function SetMemento($memento)
{
$this->memento = $memento;
}
public function GetMemento()
{
return $this->memento;
}
}
Um es ganz klar auszudrücken: Der Memo-Modus besteht darin, eine externe Klasse B den internen Zustand von A speichern zu lassen und diesen Zustand dann zu gegebener Zeit einfach wiederherzustellen.
Es gibt tatsächlich viele Anwendungsszenarien für den Memo-Modus, wie z. B. Browser-Rollback, Datenbanksicherung und -wiederherstellung, Betriebssystemsicherung und -wiederherstellung, Rückgängigmachen und Wiederherstellen von Dokumenten, Bedauern bei Schach- und Kartenspielen usw. Dieser Modus kann das Original beibehalten Server-Kapselung, das heißt, diese Zustände müssen vor externen Objekten verborgen werden, sodass sie nur zur Aufzeichnung an ein Memo-Objekt übergeben werden können
Das Kopieren von Zuständen zwischen dem Urheber und dem Memo kann zu Leistungsproblemen führen, insbesondere aufgrund der Komplexität Große Objekte Der interne Zustand des Computers führt auch zu einigen Codierungslücken, z. B. zum Fehlen bestimmter Zustände. Haben Sie von der Zeitmaschinenfunktion des Mac gehört, die den Computer zu einem bestimmten Zeitpunkt in einen Zustand zurückversetzen kann? Tatsächlich hat auch Windows Ghost eine ähnliche Funktion. Auch unser mobiles Betriebssystem hat beschlossen, eine solche Funktion zu entwickeln. Wenn wir auf Time Machine Backup klicken, werden alle Informationen, Daten und Statusinformationen auf dem Telefon komprimiert und gespeichert. Wenn der Benutzer dies zulässt, laden wir das komprimierte Paket auf unseren Cloud-Server hoch, um zu vermeiden, dass der Telefonspeicher des Benutzers belegt wird , es wird Es kann nur im Mobiltelefonspeicher des Benutzers gespeichert werden. Wenn das Mobiltelefon des Benutzers zu einem bestimmten Zeitpunkt wiederhergestellt werden muss, werden alle Time-Machine-Backups aufgelistet. Der Benutzer kann den Systemstatus des Mobiltelefons mit nur einem Fingerklick wiederherstellen Das ist doch sehr praktisch! !
Vollständiger Code: https://github.com/zhangyue0503/designpatterns-php/blob/master/17.memento/source/memento.php
Vollständiger Quellcode: 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视频教程》
Das obige ist der detaillierte Inhalt vonLassen Sie uns über den Memo-Modus in PHP sprechen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!