首頁  >  文章  >  後端開發  >  詳解PHP設計模式之備忘錄模式

詳解PHP設計模式之備忘錄模式

*文
*文原創
2018-01-05 17:52:021697瀏覽

本文主要介紹了php設計模式中的備忘錄模式,使用php實現備忘錄模式,有興趣的小夥伴可以參考一下。希望對大家有幫助。

一、意圖
在不破壞封裝性的前提下,捕捉一個物件的內部狀態,並在該物件之外保存這個狀態。這樣可以在以後把該物件的狀態恢復到之前儲存的狀態。

二、備忘錄模式結構圖

#三、備忘錄模式中主要角色
1、備忘錄(Memento)角色:
儲存發起人(Originator)物件的內部狀態,而發起人根據需要決定備忘錄儲存發起人的哪些內部狀態。
備忘錄可以保護其內容不被發起人(Originator)物件以外的任何物件所讀取。
2、發起人(Originator)角色:
建立一個含有目前的內部狀態的備忘錄物件
使用備忘錄物件儲存其內部狀態
3、負責人(Caretaker)角色:
負責保存備忘錄對象,不檢查備忘錄對象的內容
四、備忘錄模式的優點和缺點
備忘錄模式的優點:
1、有時一些發起人物件的內部資訊必須保存在發起人物件以外的地方,但是必須由發起人對象自己讀取。
2、簡化了發起人(Originator)類別。發起人(Originator)不再需要管理和保存其內部狀態的一個個版本,客戶端可以自行管理它們所需要的這些狀態的版本
3、當發起人角色的狀態改變的時候,有可能這個狀態無效,這時候就可以使用暫時儲存的備忘錄將狀態復原。
備忘錄模式的缺點:
1、如果發起人角色的狀態需要完整地儲存到備忘錄物件中,那麼在資源消耗上面備忘錄物件會很昂貴。
2、當負責人角色儲存一個備忘錄的時候,負責人可能並不知道這個狀態會佔用多大的儲存空間,因此無法提醒使用者一個作業是否會很昂貴。
3、當發起人角色的狀態改變的時候,有可能這個狀態無效。
五、備忘錄模式適用場景
1、必須保存一個物件在某一個時刻的(部分)狀態,這樣以後需要時它才能恢復到先前的狀態。
2、如果一個用介面來讓它物件直接得到這些狀態,將會暴露物件的實作細節並破壞物件的封裝性。
六、備忘錄模式與其它模式
1、命令模式(command模式):Command模式也可以用來恢復物件的狀態,一般Command模式可以支持多層次狀態的回滾,Memento只是簡單的還原(快照)。在Command模式的每一個undo中,都可以使用Memento來儲存物件的狀態。
2、迭代器模式(Iterator模式):備忘錄可以用來迭代
七、備忘錄模式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