1. 程式人生 > >PHP設計模式 - 備忘錄模式

PHP設計模式 - 備忘錄模式

分享圖片 ctrl php create 封裝性 職責 clip 進行 角色

備忘錄模式又叫做快照模式(Snapshot)或 Token 模式,備忘錄模式的用意是在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態,這樣就可以在合適的時候將該對象恢復到原先保存的狀態。

我們在編程的時候,經常需要保存對象的中間狀態,當需要的時候,可以恢復到這個狀態。比如,我們使用Eclipse進行編程時,假如編寫失誤(例如不小心誤刪除了幾行代碼),我們希望返回刪除前的狀態,便可以使用Ctrl+Z來進行返回。這時我們便可以使用備忘錄模式來實現。
UML:
技術分享圖片
備忘錄模式所涉及的角色有三個:備忘錄(Memento)角色、發起人(Originator)角色、負責人(Caretaker)角色。

這三個角色的職責分別是:

發起人:記錄當前時刻的內部狀態,負責定義哪些屬於備份範圍的狀態,負責創建和恢復備忘錄數據。
備忘錄:負責存儲發起人對象的內部狀態,在需要的時候提供發起人需要的內部狀態。
管理角色:對備忘錄進行管理,保存和提供備忘錄。

<?php

class 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() {
        echo $this->_state;echo "<br>";
    }

}

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($memento);
$org->showState();

/* 改變目標對象的狀態 */
$org->setState(‘close‘);
$org->showState();

/* 還原操作 */
$org->restoreMemento($caretaker->getMemento());
$org->showState();
/* 輸出:
open
close
open
close
open */
?>

PHP設計模式 - 備忘錄模式