18 備忘錄模式

2021-10-04 10:13:21 字數 2541 閱讀 8985

在不破壞封裝的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存該狀態。這樣以後就可將該物件恢復到原先儲存的狀態

理解originator:原發器,使用備忘錄來儲存某個時刻原發器自身的狀態,也可以使用備忘錄來恢復內部狀態

memento:備忘錄,儲存原發器物件的內部狀態,原發器外部的物件不應該能訪問到備忘錄物件的內部資料

caretaker:備忘錄管理者,主要負責儲存備忘錄物件,但是沒有許可權對備忘錄物件的內容進行操作或檢查 優點

更好的封裝性:外界無法訪問memento中細節,只有originator內部可以

簡化了原發器:備忘錄物件被儲存到原發器物件之外,讓客戶來管理他們請求的狀態,從而讓原發器物件得到簡化

窄介面和寬介面:備忘錄模式,通過引入窄介面和寬介面,使得不同的地方,對備忘錄物件的訪問是不一樣的。窄介面保證了只有原發器才可以訪問備忘錄物件的狀態 缺點

可能會導致高開銷:備忘錄模式基本的功能,就是對備忘錄物件的儲存和恢復,它的基本實現方式就是快取備忘錄物件。這樣一來,如果需要快取的資料量很大,或者是特別頻繁的建立備忘錄物件,開銷是很大的

本質:儲存和恢復內部狀態

使用場景

如果必須儲存乙個物件在某乙個時刻的全部或者部分狀態,這樣在以後需要的時候,可以把該物件恢復到先前的狀態。可以使用備忘錄模式,使用備忘錄物件來封裝和儲存需要儲存的內部狀態,然後把備忘錄物件儲存到管理者物件裡面,在需要的時候,再從管理者物件裡面獲取備忘錄物件,來恢復物件的狀態

如果需要儲存乙個物件的內部狀態,但是如果用介面來讓其它物件直接得到這些需要儲存的狀態,將會暴露物件的實現細節並破壞物件的封裝性。可以使用備忘錄模式,把備忘錄物件實現成為原發器物件的內部類,而且還是私有的,從而保證只有原發器物件才能訪問該備忘錄物件。這樣既儲存了需要儲存的狀態,又不會暴露原發器物件的內部實現細節 類圖

* 模擬執行流程a的物件的備忘錄介面,是個窄介面

*/public

inte***ce

flowamockmemento

flowamock:originator

/**

* 模擬執行流程a,只是乙個示意,代指某個具體流程

*/public

class

flowamock

/** * 示意,執行流程的第乙個階段

*/public

void

runphaseone()

/** * 示意,按照方案一來執行流程後半部分

*/public

void

schema1()

/** * 示意,按照方案二來執行流程後半部分

*/public

void

schema2()

/** * 建立儲存原發器物件的狀態的備忘錄物件

* @return 建立好的備忘錄物件

*/public flowamockmemento creatememento()

/** * 重新設定原發器物件的狀態,讓其回到備忘錄物件記錄的狀態

* @param memento 記錄有原發器狀態的備忘錄物件

*/public

void

setmemento

(flowamockmemento memento)

/** * 真正的備忘錄物件,實現備忘錄窄介面

* 實現成私有的內部類,不讓外部訪問

*/private

static

class

mementoimpl

implements

flowamockmemento

public

intgettempresult()

public string gettempstate()

}}

flowamementocaretaker:caretaker

/**

* 負責儲存模擬執行流程a的物件的備忘錄物件

*/public

class

flowamementocaretaker

/** * 獲取被儲存的備忘錄物件

* @return 被儲存的備忘錄物件

*/public flowamockmemento retrivememento()

}

client

public

class

client

}

18.2 雙重介面問題

所謂雙重介面,就是對某乙個物件提供寬介面,而對另乙個物件提供窄介面

案例中,對caretaker提供的是窄介面flowamockmemento,無法訪問物件的任何內容,對flowamock提供的是寬介面mementoimpl,因此其內部可以訪問mementoimpl的方法

18 備忘錄模式

package memento 以前的小霸王遊戲是不是可以儲存遊戲進度?是的 那是怎麼實現的呢?應該是.來 先簡單實現一下 public class commonly class gamerole 獲得初始狀態 public void getinitstate 戰鬥 public void figh...

備忘錄模式

備忘錄模式 memento 在不破壞封裝性的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態。originator 發起人 負責建立乙個備忘錄memento,用以記錄當前時刻它的內部狀態,並可以使用備忘錄恢復內部狀態。originator可根據需要...

備忘錄模式

先從物件導向的三大特徵之一封裝說起。物件導向的封裝簡單點說就是把狀態 資料 和行為 操作這些資料的方法 放到一起,構成乙個單元,通常叫做類。乙個物件的行為是事先確定好的 靜態 一些指令碼,如果物件的狀態相同,物件看起來就是一樣的。所以當我們需要把乙個物件的某一時刻儲存起來,那麼只需要儲存它在那個時刻...