애플리케이션 설계 과정에서 제가 최근 작성하고 있는 파일 관리 시스템과 같은 일부 특정 작업은 실행 취소를 지원할 수 있어야 합니다. 이름 바꾸기, 복사, 잘라내기 등과 같은 일부 기본 파일 작업은 더 나은 사용자 환경을 제공하기 위해 실행 취소 및 다시 실행 작업을 지원해야 합니다. 우리 모두 알고 있듯이 실행 취소 및 다시 실행 작업을 지원하려면 두 가지 모드가 필요합니다. 즉, 메모 모드(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; } }
소스 구현 :
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 튜토리얼에 관심이 있는 친구들에게 도움이 되었으면 좋겠습니다.