アプリケーションの設計プロセスでは、最近作成していたファイル管理システムなど、一部の特定の操作で元に戻す機能をサポートできる必要があります。名前変更、コピー、切り取りなどの一部の基本的なファイル操作では、より良いユーザー エクスペリエンスを提供するために、元に戻す操作とやり直し操作をサポートする必要があります。ご存知のとおり、元に戻す操作とやり直し操作には 2 つのモードをサポートする必要があります。メメント モード (memento) はオブジェクト操作データのステータスを保存し、コマンド モード (コマンド) はユーザー要求をカプセル化します。これらを組み合わせると、優れた元に戻すおよびやり直しの操作が可能になります。コマンドモードについては上記の記事を参照してリンクを開いてください。以下は主にメモモードの実装について説明します。間違いがあればお知らせください。
メモ モードには 3 つの主な参加者があります:
a. ステータス情報を保存する Memento オブジェクト (Memento)
b. ステータス情報を生成する Originator (Originator)
c. メモ オブジェクトのマネージャー (CareTaker)
発信者は 2 つの外部インターフェイスを提供します:
create_memento(); //保存对象状态信息创建一个备忘录返回 set_memento(Memento $mem); //根据传入的备忘录获取状态信息,恢复状态
set_state(State $state); //设备备忘录当前状态 get_state(); //获取备忘录当前状态Memo オブジェクトの実装:
class Memento { private $state; public function get_state(){ return $this->state; } public function set_state(State $state){ $this->state = clone $state; } }set_state インターフェイスは、State パラメーター プロンプトを通じてパラメーター タイプの一意性を保証します。 PHP はデフォルトでオブジェクトを割り当てるときに C++ のようなコピー コンストラクターを実行しないことに注意してください。PHP は参照オブジェクト カウンタに基づいており、オブジェクト割り当てのデフォルト カウンタは 1 ずつ増加します。ここでは、PHP が提供するクローン操作を使用して、新しいオブジェクトを確実に取得します。
オリジネーター実装:
class Originator{ private $state; function _construct(){ $this->state = new State(); $this->state->set('action', 'create originator'); } function do_action1(){ $this->state->set('action', 'do_action 1'); } function do_action2(){ $this->state->set('action', 'do_action 2'); } function create_memento(){ $mem = new Memento(); $men->set_state($this->state); return $mem; } function set_memento(Memento $mem){ $this->state = $mem->get_state(); } function dump(){ echo $this->state->get('action') . "\n"; } }
class State{ private $values = array(); public function set($key, $value){ $this->values[$key] = $value; } public function get($key){ if(isset($this->values[$key])){ return $this->values[$key]; } return null; } }最後に、メモマネージャーの簡単な実装:
class CareTaker{ private $command; function __construct($cmd="Originator1"){ $this->command = $cmd; } private function do_execute(){ switch($this->command){ case 'Originator1':{ $action = new Originator(); $mem1 = $action->create_memento(); $action->dump(); $action->do_action1(); $mem2 = $action->create_memento(); $action->dump(); $action->do_action2(); $mem3 = $action->create_memento(); $action->dump(); //状态恢复 $action->set_memento($mem2); $action->dump(); $action->set_memento($mem1); $action->dump(); } } } }
終わり
以上、メモモードの側面も含めた簡単な分析を紹介しましたが、PHP チュートリアルに興味のある友人に役立つことを願っています。