Memo pattern and its PHP implementation

伊谢尔伦
Release: 2023-03-02 18:46:01
Original
1326 people have browsed it

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

Memo pattern and its PHP implementation

Instances

<?php
class Originator { // 发起人(Originator)角色
    private $_state;
    public function __construct() {
        $this->_state = &#39;&#39;;
    }
    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(&#39;open&#39;);
$org->showState();
/* 创建备忘 */
$memento = $org->createMemento();
/* 通过Caretaker保存此备忘 */
$caretaker = new Caretaker();
$caretaker->setMemento($memento);
/* 改变目标对象的状态 */
$org->setState(&#39;close&#39;);
$org->showState();
/* 还原操作 */
$org->restoreMemento($caretaker->getMemento());
$org->showState();
?>
Copy after login

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.


Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template