標(biāo)簽: 設(shè)計模式初涉
描述性文字
本節(jié)講解的是行為型設(shè)計模式種的:備忘錄模式(Memento Pattern),說到這個模式
想起以前用GBA玩寵物小精靈綠寶石的抓裂空座的時候,雖然有大師球,但是基本都
會想著用其他精靈球把神獸抓住,畢竟大師球沒得賣,所以會在在打之前存檔,
然后開始捕捉,打殘血,各種丟球,很多時候丟到裂空座技能都沒了只能掙扎,
然后死了,這個時候就肯定要去讀檔,然后繼續(xù)重復(fù)這個捕捉神獸的過程,
爭取盡量少的球,抓到神獸(PS:曾經(jīng)用了N個普通精靈球就把裂空座抓了,2333,
高興了一整天~)
這種:
需要把保存一個對象在某個時刻的狀態(tài)或部分狀態(tài),在未來某個時段需要時,
將其還原到原來記錄狀態(tài)的模式,就是 備忘錄模式。
接下來說下模式的概念相關(guān)。
概念相關(guān)
定義:
在不破壞封裝性的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外的保存
這個狀態(tài)。
三個角色:
-
Originator:發(fā)起人,創(chuàng)建一個備忘錄,可以記錄,恢復(fù)自身的內(nèi)部狀態(tài),還可根據(jù)
需求決定存儲那些內(nèi)部狀態(tài)。 - Memento:備忘錄,存儲發(fā)起人角色的內(nèi)部狀態(tài),并防止外部對象訪問備忘錄。
-
Caretaker:管理者,存儲備忘錄,不能對備忘錄內(nèi)容進行訪問,只能將其傳遞
給其他對象。
UML類圖
使用場景
保存一個對象在某一個時刻的全部狀態(tài)或部分狀態(tài),這樣以后需要時它能夠恢復(fù)到先前
的狀態(tài),實現(xiàn)撤銷操作。防止外界對象破壞一個對象歷史狀態(tài)的封裝性。
如果有需要提供回滾操作的需求,使用備忘錄模式非常適合。
優(yōu)缺點
優(yōu)點
- 1.更好的封裝性,不把發(fā)起人對象的內(nèi)部實現(xiàn)細節(jié)暴露給外部;
- 2.簡化了發(fā)起人,把備忘錄對象保存到發(fā)起人對象之外,讓客戶來管理請求的狀態(tài);
- 3.窄接口和寬接口,債基口保證了只有發(fā)起者才能訪問備忘錄對象的狀態(tài);
缺點
資源消耗過大,如果需要保存的原發(fā)器類的成員變量太多,就不可避免需要占用大量
的存儲空間,每保存一次對象的狀態(tài)都需要消耗一定的系統(tǒng)資源。
代碼示例
這里舉個簡單的RPG游戲的例子,存檔保存當(dāng)前血量,藍量,以及有用金幣。
想定義備忘錄類,即存檔的內(nèi)容
接著定義一個角色類(發(fā)起人角色),除了屬性定義,還有兩件關(guān)鍵的事
要做:定義保存方法,保存自身狀態(tài);定義恢復(fù)方法,傳入備忘錄對象,
自行回復(fù)需要回復(fù)的項。
再接著是備忘錄管理者類,只負(fù)責(zé)備忘錄對象的傳遞!
PS:如果是多個存檔的,可以用一個集合存?zhèn)渫?/strong>,然后根據(jù)一個所以
來獲取對應(yīng)的備忘錄!
最后,客戶端調(diào)用
輸出結(jié)果
好的,代碼非常簡單,相信一看就懂了~
本節(jié)示例代碼:
https://github.com/coder-pig/DesignPatternsExample/tree/master/17.Memento%20Pattern