>백엔드 개발 >PHP 튜토리얼 >메모 패턴에 대한 간략한 분석

메모 패턴에 대한 간략한 분석

WBOY
WBOY원래의
2016-08-08 09:32:39982검색

애플리케이션 설계 과정에서 제가 최근 작성하고 있는 파일 관리 시스템과 같은 일부 특정 작업은 실행 취소를 지원할 수 있어야 합니다. 이름 바꾸기, 복사, 잘라내기 등과 같은 일부 기본 파일 작업은 더 나은 사용자 환경을 제공하기 위해 실행 취소 및 다시 실행 작업을 지원해야 합니다. 우리 모두 알고 있듯이 실행 취소 및 다시 실행 작업을 지원하려면 두 가지 모드가 필요합니다. 즉, 메모 모드(memento)는 개체 작업 데이터 상태를 저장하고 명령 모드(command)는 사용자 요청을 캡슐화합니다. 이를 결합하면 실행 취소 및 다시 실행 작업이 잘 수행됩니다. 명령 모드는 위 글을 참고하시고 클릭하시면 링크를 열 수 있습니다. 다음은 주로 메모 모드 구현에 대한 내용입니다. 오류가 있으면 알려주세요.

메모 모드에는 세 가지 주요 참여자가 있습니다.
a. 상태 정보를 저장하는 Memento 객체(Memento)
b. 상태 정보를 생성하는 Originator(Originator)
c. 메모 개체 관리자(CareTaker)

발신자는 두 가지 외부 인터페이스를 제공합니다.

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

메모 개체 두 가지 인터페이스를 제공합니다:
    set_state(State $state);    //设备备忘录当前状态
    get_state();                //获取备忘录当前状态
메모 객체 구현:

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 활용 - 계속