您好,登錄后才能下訂單哦!
怎么在php中實(shí)現(xiàn)一個備忘錄模式?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
一、意圖
在不破壞封裝性的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣可以在以后把該對象的狀態(tài)恢復(fù)到之前保存的狀態(tài)。
二、備忘錄模式結(jié)構(gòu)圖
三、備忘錄模式中主要角色
1、備忘錄(Memento)角色:
存儲發(fā)起人(Originator)對象的內(nèi)部狀態(tài),而發(fā)起人根據(jù)需要決定備忘錄存儲發(fā)起人的哪些內(nèi)部狀態(tài)。
備忘錄可以保護(hù)其內(nèi)容不被發(fā)起人(Originator)對象之外的任何對象所讀取。
2、發(fā)起人(Originator)角色:
創(chuàng)建一個含有當(dāng)前的內(nèi)部狀態(tài)的備忘錄對象
使用備忘錄對象存儲其內(nèi)部狀態(tài)
3、負(fù)責(zé)人(Caretaker)角色:
負(fù)責(zé)保存?zhèn)渫泴ο?,不檢查備忘錄對象的內(nèi)容
四、備忘錄模式的優(yōu)點(diǎn)和缺點(diǎn)
備忘錄模式的優(yōu)點(diǎn):
1、有時一些發(fā)起人對象的內(nèi)部信息必須保存在發(fā)起人對象以外的地方,但是必須要由發(fā)起人對象自己讀取。
2、簡化了發(fā)起人(Originator)類。發(fā)起人(Originator)不再需要管理和保存其內(nèi)部狀態(tài)的一個個版本,客戶端可以自行管理它們所需要的這些狀態(tài)的版本
3、當(dāng)發(fā)起人角色的狀態(tài)改變的時候,有可能這個狀態(tài)無效,這時候就可以使用暫時存儲起來的備忘錄將狀態(tài)復(fù)原。
備忘錄模式的缺點(diǎn):
1、如果發(fā)起人角色的狀態(tài)需要完整地存儲到備忘錄對象中,那么在資源消耗上面?zhèn)渫泴ο髸馨嘿F。
2、當(dāng)負(fù)責(zé)人角色將一個備忘錄存儲起來的時候,負(fù)責(zé)人可能并不知道這個狀態(tài)會占用多大的存儲空間,從而無法提醒用戶一個操作是否會很昂貴。
3、當(dāng)發(fā)起人角色的狀態(tài)改變的時候,有可能這個狀態(tài)無效。
五、備忘錄模式適用場景
1、必須保存一個對象在某一個時刻的(部分)狀態(tài),這樣以后需要時它才能恢復(fù)到先前的狀態(tài)。
2、如果一個用接口來讓其它對象直接得到這些狀態(tài),將會暴露對象的實(shí)現(xiàn)細(xì)節(jié)并破壞對象的封裝性。
六、備忘錄模式與其它模式
1、命令模式(command模式):Command模式也可以用來恢復(fù)對象的狀態(tài),一般Command模式可以支持多級狀態(tài)的回滾,Memento只是簡單的恢復(fù)(快照)。在Command模式的每一個undo中,可以使用Memento來保存對象的狀態(tài)。
2、迭代器模式(Iterator模式):備忘錄可以用于迭代
七、備忘錄模式PHP示例
<?php /** * 發(fā)起人(Originator)角色 */ class Originator { private $_state; public function __construct() { $this->_state = ''; } /** * 創(chuàng)建備忘錄 * @return Memento 包含當(dāng)前狀態(tài)的備忘錄對象 */ public function createMemento() { return new Memento($this->_state); } /** * 將發(fā)起人恢復(fù)到備忘錄對象記錄的狀態(tài)上 * @param Memento $memento */ public function restoreMemento(Memento $memento) { $this->_state = $memento->getState(); } public function setState($state) { $this->_state = $state; } public function getState() { return $this->_state; } /** * 測試用方法,顯示狀態(tài) */ public function showState() { echo "Original Status:", $this->getState(), "<br />"; } } /** * 備忘錄(Memento)角色 */ class Memento { private $_state; public function __construct($state) { $this->setState($state); } public function getState() { return $this->_state; } public function setState($state) { $this->_state = $state; } } /** * 負(fù)責(zé)人(Caretaker)角色 */ class Caretaker { private $_memento; public function getMemento() { return $this->_memento; } public function setMemento(Memento $memento) { $this->_memento = $memento; } } /** * 客戶端 */ class Client { /** * Main program. */ public static function main() { /* 創(chuàng)建目標(biāo)對象 */ $org = new Originator(); $org->setState('open'); $org->showState(); /* 創(chuàng)建備忘 */ $memento = $org->createMemento(); /* 通過Caretaker保存此備忘 */ $caretaker = new Caretaker(); $caretaker->setMemento($memento); /* 改變目標(biāo)對象的狀態(tài) */ $org->setState('close'); $org->showState(); /* 還原操作 */ $org->restoreMemento($caretaker->getMemento()); $org->showState(); } } Client::main(); ?>
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。