PHP設計模式 - 備忘錄模式
阿新 • • 發佈:2018-06-26
分享圖片 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設計模式 - 備忘錄模式