1. 의도
객체의 내부 상태를 캡처하고 캡슐화를 깨지 않고 이 상태를 객체 외부에 저장합니다. 이를 통해 나중에 개체의 상태를 이전에 저장된 상태로 복원할 수 있습니다.
2. 메모 모드 구조도
3. 메모모드의 주인공
1. 메멘토 역할 :
발신자 객체의 내부 상태를 저장하고, 발신자는 필요에 따라 발신자의 어떤 내부 상태를 메모에 저장할지 결정합니다.
memento는 작성자 객체가 아닌 다른 객체가 해당 내용을 읽지 못하도록 보호할 수 있습니다.
2. 창작자 역할:
현재 내부 상태를 포함하는 메모 개체 만들기
내부 상태를 저장하기 위해 메멘토 객체를 사용하세요
3. 관리인 역할:
메모 개체 저장을 담당하며 메모 개체의 내용을 확인하지 않습니다
4. 메모모드의 장점과 단점
메모모드의 장점:
1. 개시자 개체의 일부 내부 정보는 개시자 개체 외부에 저장되어야 하지만 개시자 개체 자체에서 읽어야 하는 경우가 있습니다.
2. Originator 클래스를 단순화했습니다. Originator는 더 이상 내부 상태의 버전을 관리하고 저장할 필요가 없습니다. 클라이언트는 필요한 상태의 버전을 스스로 관리할 수 있습니다.
3. 개시자 역할의 상태가 변경된 경우, 상태가 유효하지 않을 수 있으며, 이때 임시 저장된 메모를 이용하여 상태를 복원할 수 있습니다.
메모모드의 단점:
1. 개시자 역할의 상태를 메모 개체에 완전히 저장해야 하는 경우 메모 개체는 리소스 소비 측면에서 매우 비쌉니다.
2. 담당자가 메모를 저장할 때 이 상태가 얼마나 많은 저장 공간을 차지하게 될지 담당자는 알 수 없으므로 사용자에게 작업 비용이 많이 드는지 상기시킬 수 없습니다.
3. 개시자 역할의 상태가 변경되면 상태가 유효하지 않을 수 있습니다.
5. 메모 모드 적용 시나리오
1. 나중에 필요할 때 이전 상태로 복원할 수 있도록 특정 시점의 개체의 (부분) 상태를 저장해야 합니다.
2. 다른 객체가 이러한 상태를 직접 얻을 수 있도록 인터페이스를 사용하는 경우 객체의 구현 세부 정보가 노출되고 객체의 캡슐화가 파괴됩니다.
6. 메모 모드 및 기타 모드
1. 명령 모드(command mode): 명령 모드는 객체의 상태를 복원하는 데에도 사용할 수 있습니다. 일반적으로 명령 모드는 다중 레벨 상태 롤백을 지원할 수 있지만 Memento는 단순한 복구(스냅샷)입니다. ). 명령 모드를 실행 취소할 때마다 Memento를 사용하여 개체의 상태를 저장할 수 있습니다.
2. 반복자 모드(Iterator mode) : 메모를 반복하여 사용할 수 있습니다
7. 메모 모드 PHP 예제
<?php /** * 发起人(Originator)角色 */ class Originator { private $_state; public function __construct() { $this->_state = ''; } /** * 创建备忘录 * @return Memento 包含当前状态的备忘录对象 */ public function createMemento() { return new Memento($this->_state); } /** * 将发起人恢复到备忘录对象记录的状态上 * @param Memento $memento */ public function restoreMemento(Memento $memento) { $this->_state = $memento->getState(); } public function setState($state) { $this->_state = $state; } public function getState() { return $this->_state; } /** * 测试用方法,显示状态 */ public function showState() { echo "Original Status:", $this->getState(), "<br />"; } } /** * 备忘录(Memento)角色 */ class Memento { private $_state; public function __construct($state) { $this->setState($state); } public function getState() { return $this->_state; } public function setState($state) { $this->_state = $state; } } /** * 负责人(Caretaker)角色 */ class Caretaker { private $_memento; public function getMemento() { return $this->_memento; } public function setMemento(Memento $memento) { $this->_memento = $memento; } } /** * 客户端 */ class Client { /** * Main program. */ public static function main() { /* 创建目标对象 */ $org = new Originator(); $org->setState('open'); $org->showState(); /* 创建备忘 */ $memento = $org->createMemento(); /* 通过Caretaker保存此备忘 */ $caretaker = new Caretaker(); $caretaker->setMemento($memento); /* 改变目标对象的状态 */ $org->setState('close'); $org->showState(); /* 还原操作 */ $org->restoreMemento($caretaker->getMemento()); $org->showState(); } } Client::main(); ?>
위는 PHP를 사용하여 메모 모드를 구현하는 코드입니다. 메모 모드에 대해서도 몇 가지 개념적 차이가 있어 모든 분들의 학습에 도움이 되기를 바랍니다.