首頁  >  文章  >  後端開發  >  備忘錄模式及其php實現

備忘錄模式及其php實現

伊谢尔伦
伊谢尔伦原創
2016-12-01 11:52:021283瀏覽

備忘錄模式是一種行為型模式,它在不破壞封裝性的前提下,捕捉一個物件的內部狀態,並在該物件之外保存這個狀態。這樣可以在以後把該物件的狀態恢復到之前儲存的狀態。

主要角色

備忘錄(Memento)角色:儲存發起人(Originator)物件的內部狀態,而發起人則根據需要決定備忘錄儲存發起人的哪些內部狀態。備忘錄可以保護其內容不被發起人(Originator)物件以外的任何物件所讀取。

發起人(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();
?>

優缺點

優點

有時一些發起人物件的內部資訊必須保存在發起人物件以外的地方,但是要由發起人讀取人。

簡化了發起人(Originator)類別。發起人(Originator)不再需要管理和保存其內部狀態的一個個版本,客戶端可以自行管理它們所需要的這些狀態的版本

當發起人角色的狀態改變的時候,有可能這個狀態無效,這時候就可以使用暫時存放起來的備忘錄將狀態復原。

缺點

如果發起人角色的狀態需要完整地儲存到備忘錄物件中,那麼在資源消耗上面備忘錄物件會很昂貴。

當負責人角色將一個備忘錄存放起來的時候,負責人可能並不知道這個狀態會佔用多大的存儲空間,從而無法提醒用戶一個操作是否會很昂貴。

當發起人角色的狀態改變的時候,有可能這個狀態無效。


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:PHP5常用函數下一篇:PHP5常用函數