Memo pattern is a behavioral pattern that captures the internal state of an object and saves this state outside the object without destroying encapsulation. This allows you to later restore the object's state to its previously saved state.
Main role
Memento role: Stores the internal state of the originator object, and the originator decides which internal states of the originator are stored in the memento as needed. A memento can protect its contents from being read by any object other than the originator object.
Originator role: Create a memo object containing the current internal state, and use the memo object to store its internal state.
Caretaker role: Responsible for saving the memo object and not checking the contents of the memo object.
Applicable Property
Must save the (partial) state of an object at a certain moment so that it can be restored to its previous state when needed later.
If an interface is used to allow other objects to directly obtain these states, it will expose the implementation details of the object and destroy the encapsulation of the object.
Class diagram
Instances
<?php class Originator { // 发起人(Originator)角色 private $_state; public function __construct() { $this->_state = ''; } public function createMemento() { // 创建备忘录 return new Memento($this->_state); } 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() {} } class Memento { // 备忘录(Memento)角色 private $_state; public function __construct($state) { $this->setState($state); } public function getState() { return $this->_state; } public function setState($state) { $this->_state = $state;} } class Caretaker { // 负责人(Caretaker)角色 private $_memento; public function getMemento() { return $this->_memento; } public function setMemento(Memento $memento) { $this->_memento = $memento; } } // client /* 创建目标对象 */ $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(); ?>
Advantages and disadvantages
Advantages
Sometimes some internal information of the initiator object must be saved outside the initiator object, but it must be read by the initiator object itself.
Simplified the Originator class. The Originator no longer needs to manage and save versions of its internal states. Clients can manage the versions of these states they need by themselves
When the status of the Originator role changes, it is possible that the status is invalid. At this time, you can use the temporarily stored memo to restore the status.
Disadvantages
If the status of the initiator role needs to be completely stored in the memo object, the memo object will be very expensive in terms of resource consumption.
When the person in charge stores a memo, the person in charge may not know how much storage space this status will occupy, and thus cannot remind the user whether an operation will be expensive.
When the status of the initiator role changes, the status may be invalid.