中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在php中實現一個備忘錄模式

發布時間:2021-01-29 16:28:57 來源:億速云 閱讀:141 作者:Leah 欄目:開發技術

怎么在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 = '';
  }
 
  /**
   * 創建備忘錄
   * @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('open');
    $org->showState();
 
    /* 創建備忘 */
    $memento = $org->createMemento();
 
    /* 通過Caretaker保存此備忘 */
    $caretaker = new Caretaker();
    $caretaker->setMemento($memento);
 
    /* 改變目標對象的狀態 */
    $org->setState('close');
    $org->showState();
 
    /* 還原操作 */
    $org->restoreMemento($caretaker->getMemento());
    $org->showState();
  }
 
}
 
Client::main();
?>

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

松潘县| 牡丹江市| 河津市| 莲花县| 富阳市| 文成县| 北辰区| 拉孜县| 清流县| 中阳县| 巴中市| 无锡市| 松滋市| 定日县| 上犹县| 渭南市| 台中市| 桐城市| 万年县| 沁阳市| 波密县| 永昌县| 长岭县| 资溪县| 乐平市| 井冈山市| 神农架林区| 镇坪县| 班戈县| 尉犁县| 甘肃省| 彰化县| 普宁市| 泗阳县| 通河县| 施甸县| 郎溪县| 南投县| 厦门市| 黔东| 高青县|