備忘錄模式(memento)在遊戲中可用來做儲存功能。在書中使用備忘錄模式」儲存成就記錄」
直接將資料存檔功能實現於遊戲功能類中,一般來說不太理想,因為違反了單一職責原則(srp)。也就是說,各個遊戲功能類應該專心處理與遊戲相關的功能。
而記錄儲存,也應交由專職的記錄儲存類
為說明要專門寫乙個記錄儲存類呢?
書中給出了解釋說明:
如果在功能模組中實現,會將內部成員資料全部公開。
雖然可以少寫**,缺違背了介面隔離原則(isp)即除非必要,類應該儘量減少對外顯示內部的資料介面,以減少客戶端有機會破壞內部成員的記錄,而對外公布過多的操作方法,容易增加與其他系統的耦合度。
gof對備忘錄模式的定義:
在不違反封裝的原則下,獲取乙個物件的內部狀態並保留在外部,讓該物件可以在日後恢復到原先保留時的狀態。
實現思路
這裡列出幾個問題,來做思考。
如何在「不違反封裝的原則」 還能提供內部的詳細資訊?
就是由遊戲系統本身「主動提供內部資訊」存檔功能,而且也「主動」向存檔功能提供自己「系統」有關的資訊。
這與原本由遊戲本身提供一大堆「訪問內部成員」的方法,有什麼不同?最大的不同在於:
遊戲系統提供訪問內部成員方法,是讓遊戲系統處於「被動」狀態。
備忘錄模式則是將遊戲系統由「被動」改為「主動提供」,意思是,
遊戲系統自己決定要提供什麼資訊和記錄存檔功能,也由遊戲系統決定要從存檔功能中,讀取什麼樣的資料及記錄還原給內部成員。
而這些資訊記錄的設定和獲取的實現地點都在「遊戲系統類內」,不會發生在遊戲系統類以外的地方,如此就可確保類的「封裝的原則」不會被破壞。
備忘錄模式的說明
記錄擁有者originator
記錄儲存者memento
管理記錄儲存者caretaker
記錄擁有者originator
public
class originator
public
void
showinfo()
//產生要儲存的記錄
public memento creatememento()
//設定要恢復的記錄
public
void
setmemento(memento m)
}
originator(記錄擁有者)類內擁有乙個需要被儲存的成員:m_state,而這個成員將由originator(記錄擁有者)在creatememento方法中產生記錄儲存者物件,最後傳出到客戶端。
客戶端可以將之前保留的記錄儲存者物件通過記錄擁有者的類方法:setmemento傳入類中,讓originator可以恢復到之前記錄的狀態。
memento 存放在記錄擁有者(originator)的內部狀態
public
class memento
public
void
setstate(string state)
}
很簡單的乙個類,封裝了資料,通過set get 方法來讀取、儲存資料
測試備忘錄模式
void unittest()
//測試**
在測試**中,先將記錄擁有者設定為step1之後,利用creatememento方法將內部狀態保留下來(thememento)。
隨後設定為「step2」,但假設此時設定發生錯誤,只要將之前保留的狀態,利用setmemento方法再設定回去就可以了
caretaker保管所有的memento(記錄),並且管理它們
public
class caretaker
}//讀取
public memento getmemento(string version)
return m_mementos[version];
}}
測試管理記錄儲存者void unittest()
第二個測試加入了記錄物件管理類(caretaker),記錄擁有者(theoriginator)就轉而向記錄管理類找到自己需要的版本,通過過字典容器找到獲取這個記錄(memento)
總結運用備忘錄模式memento 提供了乙個不破壞原有類封裝性的「物件狀態儲存」方案,並讓物件狀態儲存可以存在多個版本,並且還可以選擇要恢復到的哪個版本。
與其他模式的合作:
如果備忘錄模式搭配命令模式來作為命令執行前的系統狀態儲存,就能讓命令在執行恢復操作時,能夠恢復到命令執行前的狀態。
其他應用方式
日誌系統用備忘錄模式,讓遊戲系統產生的資訊定期儲存。此時日誌系統就只負責儲存記錄。
Unity3D學習之剛體
前言 以前從未接觸過unity,今天接觸了unity,對自己的一些疑點做了一下總結,之所以接觸unity,是因為在畢業快實習的時候通過朋友介紹,認識了unity,過程就不說了,言歸正傳,開始我們的學習吧 我們想要完成球體自由落體後撞擊倒桌面 如圖 一般我們給球體乙個剛體屬性,球體自由下落 但我們會發...
Unity3D學習之(介面)
1 介面 介面描述的是可屬於任何類或結構的一組相關功能,所以實現介面的類或結構必須實現介面定義中指定的介面成員。介面使用inte ce 關鍵字進行定義,可由方法 屬性 事件 索引器或這四種成員型別的任意組合構成。2 介面的特性 介面類似於抽象基類,不能直接例項化介面 介面中的方法都是抽象方法,實現介...
Unity3d遊戲開發設計模式之單例設計模式
後面我將會為大家一一整理出單例模式的寫法分類 我們先了解熟悉一下什麼是單例設計模式 單例模式說明 前言 最近開始花點心思研究下設計模式,主要還是讓自己寫的 可重用性高 保證 可靠性。所謂設計模式,我找了下定義 是一套被反覆使用 多數人知曉的 經過分類編目的 設計經驗的總結。毫無疑問,設計模式於己於他...