메모 패턴 및 PHP 구현

伊谢尔伦
풀어 주다: 2023-03-02 18:46:01
원래의
1321명이 탐색했습니다.

메모 패턴은 객체의 내부 상태를 캡처하고 캡슐화를 파괴하지 않고 이 상태를 객체 외부에 저장하는 동작 패턴입니다. 이를 통해 나중에 개체의 상태를 이전에 저장된 상태로 복원할 수 있습니다.

주역

메멘토 역할: 발신자 객체의 내부 상태를 저장하고, 발신자는 필요에 따라 발신자의 어떤 내부 상태를 메멘토에 저장할지 결정합니다. memento는 작성자 객체가 아닌 다른 객체가 해당 내용을 읽지 못하도록 보호할 수 있습니다.

Originator 역할: 현재 내부 상태를 포함하는 메모 객체를 생성하고, 메모 객체를 사용하여 내부 상태를 저장합니다.

Caretaker 역할: 메모 객체의 내용을 확인하는 것이 아니라 메모 객체를 저장하는 역할 메모 객체

적용 가능성

특정 시점의 객체 상태(일부)를 나중에 필요할 때 이전 상태로 복원할 수 있도록 저장해야 합니다.

다른 객체가 이러한 상태를 직접 얻을 수 있도록 인터페이스를 사용하는 경우 객체의 구현 세부 정보가 노출되고 객체의 캡슐화가 파괴됩니다.

클래스 다이어그램

메모 패턴 및 PHP 구현

인스턴스

<?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();
?>
로그인 후 복사

장점과 단점

장점

때때로 some Initiator 객체의 내부 정보는 Initiator 객체 외부에 저장되어야 하지만 Initiator 객체 자체에서 읽어야 합니다.

Originator 클래스를 단순화했습니다. Originator는 더 이상 내부 상태의 버전을 관리하고 저장할 필요가 없습니다. 클라이언트는 필요한 상태의 버전을 스스로 관리할 수 있습니다.

Originator 역할의 상태가 변경되면 가능합니다. 이 상태는 유효하지 않습니다. 이때 임시로 저장된 메모를 이용하여 상태를 복원할 수 있습니다.

단점

초기자 역할의 상태를 메모 개체에 완전히 저장해야 하는 경우 메모 개체는 리소스 소모 측면에서 비용이 많이 듭니다.

담당자가 메모를 저장할 때 이 상태가 얼마나 많은 저장 공간을 차지하게 될지 담당자는 알 수 없기 때문에 사용자에게 작업 비용이 많이 들 것인지 상기시키지 못할 수 있습니다.

개시자 역할의 상태가 변경되면 상태가 유효하지 않을 수 있습니다.


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿