前回の記事「PHPのビルダーパターンの詳細分析」ではPHPのビルダーパターンについて紹介しましたが、次の記事ではPHPデザインパターンのメモパターンについて理解していきます。
メモ、この名前は実際にその機能を非常にわかりやすく説明しています。典型的な例は、もともとハードディスクゲームをプレイしたときのアーカイブ機能です。これから直面する大きなボスが心配なときは、通常、最初に進行状況のアーカイブを保存します。挑戦に失敗した場合は、アーカイブを直接読み込んでBOSSに挑戦する前の状態に戻すことができ、しばらく楽しく練習して再び大BOSSを解くことができます。ただし、念のため、BOSS に挑戦する前にファイルを保存しておくことをお勧めします。もう 1 つの例は、プログラマーが毎日使用するコード管理ツールである Git または Svn です。各提出はアーカイブのバックアップのようなもので、新しいコードに問題がある場合は、ロールバックして回復するだけです。これらはメモモードの代表的な応用例ですので、一緒に見ていきましょう。
GoF 定義: カプセル化を破壊することなくオブジェクトの内部状態をキャプチャし、この状態をこの外部に保存します。物体。このようにして、オブジェクトを元の保存状態に復元できます
#GoF クラス図:
##コード実装: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; } }
メモは非常にシンプルで、ステータスを記録するために使用されます。この状態をオブジェクトの形式で保存すると、作成者はさまざまな状態を記録する多数のアーカイブを簡単に作成できます。
class Caretaker { private $memento; public function SetMemento($memento) { $this->memento = $memento; } public function GetMemento() { return $this->memento; } }
マネージャークラスとも呼ばれる担当者はメモを保存し、必要なときにここからメモを取り出します。保存のみを担当し、メモを変更することはできません。複雑なアプリケーションでは、プレイヤーが選択できる複数のアーカイブ レコードを選択的に表示できるゲームと同様に、これをリストにすることができます。
$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();
クライアント呼び出しで、発信者は状態を初期化して保存し、その後状態を人為的に変更しました。このときは担当者を通じてステータスを復元するだけで済みます。
端的に言えば、メモ モードは、外部クラス B に A の内部状態を保存させ、適切なタイミングでその状態を簡単に復元することです。#完全なコード: https://github.com/zhangyue0503/designpatterns-php/blob/master/17.memento/source/memento.php
##例今回はテキスト メッセージを送信する例に戻ります。通常、テキスト メッセージや電子メールの送信などの機能を実行する場合、送信するコンテンツをデータベースまたはキャッシュから読み取って送信するキューが存在します。成功した場合は無視され、失敗した場合は、メッセージのステータスが表示されます。テキスト メッセージは失敗または再送信に変更されます。ここでは、直接前の未送信状態に戻し、次の送信キューが再度送信を行うのを待ちます。
完全なソース コード: 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视频教程》
以上がPHPのメモモードについて話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。