學(xué)習(xí)php設(shè)計(jì)模式 php實(shí)現(xiàn)備忘錄模式(Memento)
一、意圖
在不破壞封裝性的前提下,捕獲一個(gè)對象的內(nèi)部狀態(tài),并在該對象之外保存這個(gè)狀態(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)建一個(gè)含有當(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、有時(shí)一些發(fā)起人對象的內(nèi)部信息必須保存在發(fā)起人對象以外的地方,但是必須要由發(fā)起人對象自己讀取。
2、簡化了發(fā)起人(Originator)類。發(fā)起人(Originator)不再需要管理和保存其內(nèi)部狀態(tài)的一個(gè)個(gè)版本,客戶端可以自行管理它們所需要的這些狀態(tài)的版本
3、當(dāng)發(fā)起人角色的狀態(tài)改變的時(shí)候,有可能這個(gè)狀態(tài)無效,這時(shí)候就可以使用暫時(shí)存儲起來的備忘錄將狀態(tài)復(fù)原。
備忘錄模式的缺點(diǎn):
1、如果發(fā)起人角色的狀態(tài)需要完整地存儲到備忘錄對象中,那么在資源消耗上面?zhèn)渫泴ο髸?huì)很昂貴。
2、當(dāng)負(fù)責(zé)人角色將一個(gè)備忘錄存儲起來的時(shí)候,負(fù)責(zé)人可能并不知道這個(gè)狀態(tài)會(huì)占用多大的存儲空間,從而無法提醒用戶一個(gè)操作是否會(huì)很昂貴。
3、當(dāng)發(fā)起人角色的狀態(tài)改變的時(shí)候,有可能這個(gè)狀態(tài)無效。
五、備忘錄模式適用場景
1、必須保存一個(gè)對象在某一個(gè)時(shí)刻的(部分)狀態(tài),這樣以后需要時(shí)它才能恢復(fù)到先前的狀態(tài)。
2、如果一個(gè)用接口來讓其它對象直接得到這些狀態(tài),將會(huì)暴露對象的實(shí)現(xiàn)細(xì)節(jié)并破壞對象的封裝性。
六、備忘錄模式與其它模式
1、命令模式(command模式):Command模式也可以用來恢復(fù)對象的狀態(tài),一般Command模式可以支持多級狀態(tài)的回滾,Memento只是簡單的恢復(fù)(快照)。在Command模式的每一個(gè)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();
?>
以上就是使用php實(shí)現(xiàn)備忘錄模式的代碼,還有一些關(guān)于備忘錄模式的概念區(qū)分,希望對大家的學(xué)習(xí)有所幫助。
- php設(shè)計(jì)模式之原型模式分析【星際爭霸游戲案例】
- php設(shè)計(jì)模式之代理模式分析【星際爭霸游戲案例】
- php設(shè)計(jì)模式之享元模式分析【星際爭霸游戲案例】
- php設(shè)計(jì)模式之中介者模式分析【星際爭霸游戲案例】
- php設(shè)計(jì)模式之建造器模式分析【星際爭霸游戲案例】
- php設(shè)計(jì)模式之抽象工廠模式分析【星際爭霸游戲案例】
- php設(shè)計(jì)模式之工廠方法模式分析【星際爭霸游戲案例】
- PHP設(shè)計(jì)模式之觀察者模式(Observer)詳細(xì)介紹和代碼實(shí)例
- php設(shè)計(jì)模式 Template (模板模式)
- PHP常用的三種設(shè)計(jì)模式匯總
- php設(shè)計(jì)模式之備忘模式分析【星際爭霸游戲案例】
相關(guān)文章
PHP排序之二維數(shù)組的按照字母排序?qū)崿F(xiàn)代碼
PHP排序之二維數(shù)組的按照字母排序方法,在實(shí)際開發(fā)還是非常有用的,有需要的拿去2011-08-08
PHP正則匹配操作簡單示例【preg_match_all應(yīng)用】
這篇文章主要介紹了PHP正則匹配操作,結(jié)合簡單實(shí)例形式分析了php中preg_match_all針對HTML標(biāo)簽中P元素及img src元素內(nèi)容的獲取技巧,需要的朋友可以參考下2017-07-07
javascript,php獲取函數(shù)參數(shù)對象的代碼
javascript,php獲取函數(shù)參數(shù)對象的代碼,需要的朋友可以參考下。2011-02-02
PHP下使用CURL方式POST數(shù)據(jù)至API接口的代碼
PHP下使用curl方式post數(shù)據(jù)至api接口的方法,大部分的API的HTTP請求方式都為GET,所以不管用AJAX和PHP二次處理都能拿到返回的數(shù)據(jù),但是一些API的HTTP請求方式是POST,那么我們就需要使用到curl了2013-02-02

