備忘錄模式及其php實現

來源:互聯網
上載者:User
備忘錄模式是一種行為型模式,它在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外儲存這個狀態。這樣可以在以後把該對象的狀態恢複到之前儲存的狀態。

主要角色

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

發起人(Originator)角色:建立一個含有當前的內部狀態的備忘錄對象,使用備忘錄Object Storage Service其內部狀態

負責人(Caretaker)角色:負責儲存備忘錄對象,不檢查備忘錄對象的內容

適用性

必須儲存一個對象在某一個時刻的(部分)狀態,這樣以後需要時它才能恢複到先前的狀態。

如果一個用介面來讓其它對象直接得到這些狀態,將會暴露對象的實現細節並破壞對象的封裝性。

類圖

執行個體

<?phpclass Originator { // 發起人(Originator)角色    private $_state;    public function __construct() {        $this->_state = '';    }    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('open');$org->showState();/* 建立備忘 */$memento = $org->createMemento();/* 通過Caretaker儲存此備忘 */$caretaker = new Caretaker();$caretaker->setMemento($memento);/* 改變目標對象的狀態 */$org->setState('close');$org->showState();/* 還原作業 */$org->restoreMemento($caretaker->getMemento());$org->showState();?>

優缺點

優點

有時一些發起人對象的內部資訊必須儲存在發起人對象以外的地方,但是必須要由發起人對象自己讀取。

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

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

缺點

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

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

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

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.