備忘錄模式又叫作快照模式(Snapshot)或 Token 模式,備忘錄模式的用意是在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象以外保存這個狀態,這樣就能夠在合適的時候將該對象恢復到原先保存的狀態。php
咱們在編程的時候,常常須要保存對象的中間狀態,當須要的時候,能夠恢復到這個狀態。好比,咱們使用Eclipse進行編程時,假如編寫失誤(例如不當心誤刪除了幾行代碼),咱們但願返回刪除前的狀態,即可以使用Ctrl+Z來進行返回。這時咱們即可以使用備忘錄模式來實現。
UML:
備忘錄模式所涉及的角色有三個:備忘錄(Memento)角色、發起人(Originator)角色、負責人(Caretaker)角色。編程
這三個角色的職責分別是:this
發起人:記錄當前時刻的內部狀態,負責定義哪些屬於備份範圍的狀態,負責建立和恢復備忘錄數據。
備忘錄:負責存儲發起人對象的內部狀態,在須要的時候提供發起人須要的內部狀態。
管理角色:對備忘錄進行管理,保存和提供備忘錄。rest
<?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 */ ?>