Unity3D 設計模式學習之備忘錄模式

2021-08-27 14:01:29 字數 2293 閱讀 2046

備忘錄模式(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遊戲開發設計模式之單例設計模式

後面我將會為大家一一整理出單例模式的寫法分類 我們先了解熟悉一下什麼是單例設計模式 單例模式說明 前言 最近開始花點心思研究下設計模式,主要還是讓自己寫的 可重用性高 保證 可靠性。所謂設計模式,我找了下定義 是一套被反覆使用 多數人知曉的 經過分類編目的 設計經驗的總結。毫無疑問,設計模式於己於他...