>  기사  >  백엔드 개발  >  PHP 디자인 패턴 메모 패턴에 대한 자세한 설명

PHP 디자인 패턴 메모 패턴에 대한 자세한 설명

*文
*文원래의
2018-01-05 17:52:021682검색

이 글은 주로 PHP 디자인 모드 중 메모 모드를 소개하고 있으며, PHP를 사용하여 메모 모드를 구현하고 있으니 관심 있는 친구들이 참고해보세요. 그것이 모두에게 도움이 되기를 바랍니다.

1. 의도
객체의 내부 상태를 캡처하고 캡슐화를 파괴하지 않고 이 상태를 객체 외부에 저장합니다. 이를 통해 나중에 개체의 상태를 이전에 저장된 상태로 복원할 수 있습니다.

2. 메모 모드 구조도

3. 메모 모드의 주요 역할
1. 메멘토 역할:
저장 객체 내부 상태 개시자가 결정 필요에 따라 메모가 저장하는 개시자의 내부 상태입니다.
Memo는 Originator 개체가 아닌 다른 개체가 메모 내용을 읽지 못하도록 보호할 수 있습니다.
2. 작성자 역할:
현재 내부 상태를 포함하는 메모 개체 만들기
메모 개체를 사용하여 내부 상태 저장
3. 관리인 역할:
메모 개체 저장을 담당합니다. 메모 개체가 확인되지 않습니다
4. 메모 패턴의 장점과 단점
메모 패턴의 장점:
1. 때로는 개시자 개체의 내부 정보 중 일부를 개시자 개체 외부에 저장해야 합니다. 개시자 개체 자체에서 읽을 수 있습니다.
2. Originator 클래스를 단순화했습니다. Originator는 더 이상 내부 상태의 버전을 관리하고 저장할 필요가 없습니다. 클라이언트는 필요한 상태의 버전을 스스로 관리할 수 있습니다. 3. Originator 역할의 상태가 변경되면 상태가 유효하지 않을 수 있습니다. 임시로 저장된 메모를 이용하여 상태를 복원할 수 있습니다.
메모 패턴의 단점:

1. 개시자 역할의 상태를 메모 개체에 완전히 저장해야 하는 경우 메모 개체는 리소스 소비 측면에서 매우 비쌉니다. 2. 담당자가 메모를 저장할 때 이 상태가 얼마나 많은 저장 공간을 차지하게 될지 담당자는 알 수 없으므로 사용자에게 작업 비용이 많이 드는지 상기시킬 수 없습니다.
3. 개시자 역할의 상태가 변경되면 상태가 유효하지 않을 수 있습니다.


5. 메모 모드 적용 시나리오
1. 나중에 필요할 때 이전 상태로 복원할 수 있도록 특정 시점의 개체의 (부분) 상태를 저장해야 합니다.
2. 다른 객체가 이러한 상태를 직접 얻을 수 있도록 인터페이스를 사용하는 경우 객체의 구현 세부 정보가 노출되고 객체의 캡슐화가 파괴됩니다.

6. 메멘토 모드 및 기타 모드
1. 명령 모드(command mode): 명령 모드는 객체의 상태를 복원하는 데에도 사용할 수 있으며, 일반적으로 명령 모드는 다중 레벨 상태 롤백을 지원할 수 있지만 Memento는 (스냅샷) 단순한 복원입니다. 명령 모드를 실행 취소할 때마다 Memento를 사용하여 개체의 상태를 저장할 수 있습니다.
2. Iterator 모드(Iterator 모드): 메모를 사용하여 반복할 수 있습니다.

7. 메모 모드 PHP 예제

<?php
/**
 * 发起人(Originator)角色
 */
class Originator {
 
  private $_state;
 
  public function __construct() {
    $this->_state = &#39;&#39;;
  }
 
  /**
   * 创建备忘录
   * @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(&#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();
  }
 
}
 
Client::main();
?>
관련 권장 사항:


PHP 디자인 패턴의 브리지 모드에 대한 자세한 설명

PHP 디자인 패턴의 프록시 패턴에 대한 자세한 설명

PHP 디자인 패턴의 전략 패턴에 대한 자세한 설명

위 내용은 PHP 디자인 패턴 메모 패턴에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.