備忘錄模式
備忘錄(Memento、Snapshot)模式屬于行為型模式的一種。
備忘錄模式主要用于捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),以便在將來的某個(gè)時(shí)候恢復(fù)此狀態(tài)。
備忘錄模式的核心思想是將對(duì)象的狀態(tài)保存在一個(gè)獨(dú)立的對(duì)象中,這樣既能保持對(duì)象的封裝性,又能方便地恢復(fù)對(duì)象到之前的狀態(tài)。
我們使用的幾乎所有軟件都用到了備忘錄模式。大多數(shù)軟件提供的保存、打開,以及編輯過程中的Undo、Redo都是備忘錄模式的應(yīng)用。Java的序列化也可以看作是備忘錄模式。
備忘錄模式適合在有撤銷操作、恢復(fù)狀態(tài)、對(duì)象狀態(tài)追蹤等場(chǎng)景下使用。
備忘錄模式通常有以下組成部分:
- Memento(備忘錄):存儲(chǔ)對(duì)象的內(nèi)部狀態(tài)。備忘錄通常是一個(gè)不可變的對(duì)象,即在創(chuàng)建之后不允許更改它的內(nèi)容。
- Originator(發(fā)起人):發(fā)起人是需要保存其狀態(tài)的對(duì)象。它創(chuàng)建一個(gè)備忘錄,保存當(dāng)前的狀態(tài),并可以通過備忘錄恢復(fù)到之前的狀態(tài)。發(fā)起人負(fù)責(zé)生成和恢復(fù)備忘錄,但它對(duì)備忘錄的內(nèi)部狀態(tài)一無所知。
- Caretaker(看護(hù)者):看護(hù)者負(fù)責(zé)保存?zhèn)渫洠荒苄薷膫渫浀膬?nèi)容。看護(hù)者是一個(gè)管理者,通常用于保存多個(gè)備忘錄的狀態(tài),供需要時(shí)進(jìn)行恢復(fù)。
如果我們使用的編程語言支持嵌套類(如Java、C++、 C# 等),則可將備忘錄嵌套在Originator類中; 如果不支持(如PHP等), 那么我們可以從備忘錄類中抽取一個(gè)空接口,然后讓其他所有對(duì)象通過接口來引用備忘錄。 我們還可以在該接口中添加一些元數(shù)據(jù)操作,但不能暴露Originator類的狀態(tài)。
我們用備忘錄模式實(shí)現(xiàn)一個(gè)簡(jiǎn)單的文本編輯器中的撤銷功能。當(dāng)用戶輸入文本時(shí),編輯器會(huì)保存當(dāng)前文本狀態(tài),這樣當(dāng)用戶點(diǎn)擊“撤銷”按鈕時(shí),編輯器能夠恢復(fù)到上一個(gè)狀態(tài)。
1、Memento: 備忘錄類
2、Originator: 發(fā)起人類
3、Caretaker: 看護(hù)者類
4、客戶端
備忘錄模式的優(yōu)缺點(diǎn)。
優(yōu)點(diǎn):
- 保持封裝性:備忘錄模式允許將對(duì)象的狀態(tài)保存在外部,但不暴露對(duì)象的內(nèi)部實(shí)現(xiàn)。發(fā)起人對(duì)象可以將狀態(tài)保存在備忘錄中,而無需讓其他對(duì)象直接訪問內(nèi)部狀態(tài)。
- 簡(jiǎn)化恢復(fù)操作:通過備忘錄,系統(tǒng)可以輕松地將對(duì)象恢復(fù)到之前的狀態(tài),而無需手動(dòng)追蹤每個(gè)狀態(tài)的變更。
- 支持多次恢復(fù):可以創(chuàng)建多個(gè)備忘錄對(duì)象,用于在不同的時(shí)刻恢復(fù)到不同的狀態(tài)。
缺點(diǎn):
- 增加了系統(tǒng)的復(fù)雜性:備忘錄模式涉及多個(gè)對(duì)象的協(xié)作,可能會(huì)導(dǎo)致系統(tǒng)設(shè)計(jì)更加復(fù)雜。
- 內(nèi)存消耗大:每次狀態(tài)變更都會(huì)創(chuàng)建一個(gè)新的備忘錄,這可能導(dǎo)致內(nèi)存消耗較大,尤其是狀態(tài)變化頻繁時(shí)。
- 備忘錄管理問題:如果管理不當(dāng),備忘錄可能會(huì)堆積成大量的無用對(duì)象,需要額外的清理策略。
我們可以同時(shí)使用命令模式和備忘錄模式來實(shí)現(xiàn) “撤銷”功能。命令用于對(duì)目標(biāo)對(duì)象執(zhí)行各種不同的操作,備忘錄用來保存一條命令執(zhí)行前該對(duì)象的狀態(tài)。
人生的確充滿艱難險(xiǎn)阻,但回蕩不息的主旋律,是不期而遇的溫暖和生生不息的希望。-- 煙沙九洲
浙公網(wǎng)安備 33010602011771號(hào)