ホームページ  >  記事  >  バックエンド開発  >  メモモードの簡単な分析

メモモードの簡単な分析

WBOY
WBOYオリジナル
2016-08-08 09:32:39961ブラウズ

アプリケーションの設計プロセスでは、最近作成していたファイル管理システムなど、一部の特定の操作で元に戻す機能をサポートできる必要があります。名前変更、コピー、切り取りなどの一部の基本的なファイル操作では、より良いユーザー エクスペリエンスを提供するために、元に戻す操作とやり直し操作をサポートする必要があります。ご存知のとおり、元に戻す操作とやり直し操作には 2 つのモードをサポートする必要があります。メメント モード (memento) はオブジェクト操作データのステータスを保存し、コマンド モード (コマンド) はユーザー要求をカプセル化します。これらを組み合わせると、優れた元に戻すおよびやり直しの操作が可能になります。コマンドモードについては上記の記事を参照してリンクを開いてください。以下は主にメモモードの実装について説明します。間違いがあればお知らせください。

メモ モードには 3 つの主な参加者があります:
a. ステータス情報を保存する Memento オブジェクト (Memento)
b. ステータス情報を生成する Originator (Originator)
c. メモ オブジェクトのマネージャー (CareTaker)

発信者は 2 つの外部インターフェイスを提供します:

create_memento(); //保存对象状态信息创建一个备忘录返回
set_memento(Memento $mem); //根据传入的备忘录获取状态信息,恢复状态   

メモ オブジェクトは 2 つのインターフェイスを提供します:
    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 チュートリアルに興味のある友人に役立つことを願っています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:PDOの使用 - 続く次の記事:PDOの使用 - 続く