java設計模式 備忘錄模式

2021-06-17 16:43:02 字數 2642 閱讀 6741

備忘錄模式

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

涉及角色:

1.originator(發起人):

負責建立乙個備忘錄memento,用以記錄當前時刻自身的內部狀態,並可使用備忘錄恢復內部狀態。

originator可以根據需要決定memento儲存自己的哪些內部狀態。

2.memento(備忘錄):

負責儲存originator物件的內部狀態,並可以防止originator以外的其他物件訪問備忘錄。備忘

錄有兩個介面:caretaker只能看到備忘錄的窄介面,他只能將備忘錄傳遞給其他物件。originator卻可看到備忘錄的寬介面,

允許它訪問返回到先前狀態所需要的所有資料。

3.caretaker(管理者):

負責備忘錄memento,不能對memento的內容進行訪問或者操作。

備忘錄模式的優點和缺點

一、備忘錄模式的優點

1、有時一些發起人物件的內部資訊必須儲存在發起人物件以外的地方,但是必須要由發起人物件自己讀取,這時,

使用備忘錄模式可以把複雜的發起人內部資訊對其他的物件遮蔽起來,從而可以恰當地保持封裝的邊界。

2、本模式簡化了發起人類。發起人不再需要管理和儲存其內部狀態的乙個個版本,客戶端可以自行管理他們所需

要的這些狀態的版本。

3、當發起人角色的狀態改變的時候,有可能這個狀態無效,這時候就可以使用暫時儲存起來的備忘錄將狀態復原。

二、備忘錄模式的缺點:

1、如果發起人角色的狀態需要完整地儲存到備忘錄物件中,那麼在資源消耗上面備忘錄物件會很昂貴。

2、當負責人角色將乙個備忘錄 儲存起來的時候,負責人可能並不知道這個狀態會占用多大的儲存空間,從而無法提醒使用者乙個

操作是否很昂貴。

3、當發起人角色的狀態改變的時候,有可能這個協議無效。如果狀態改變的成功率不高的話,不如採取「假如」協議模式。

下面是乙個例子:

1.memento:此為備忘錄,用來對原發器物件的狀態state進行儲存:

public class memento 

public string getstate()

public void setstate(string state)

}

2.originator:此為原發器,它裡面有乙個關鍵狀態,用1.中的類可以進行備份,需要的話,可以用這個備份來進行還原。同時此類裡面有乙個關鍵的生成備份的creatememento()方法

,同時還有乙個用於還原的usememento(memento m)方法:

public class originator 

public void setstate(string state)

public memento creatememento()

public void usememento(memento m)

public void showstate()

}

3.caretaker:此類用來對進行備份的memento進行儲存,然後在需要的時候,呼叫此類裡面的那個memento物件引用:

public class caretaker 

public void setmemento(memento m)

}

4.測試程式,先設定originator的狀態為"正在睡覺中。。。。。。",然後進行備份,而不是直接進行輸出狀態

,接下來再設定其狀態為」正在學習中。。。。。。「。輸出其狀態為」正在學習

中。。。。。。「,然後,再把第乙個狀態還原回來,緊接著輸出其狀態:

import org.junit.test;

public class mementomodetest

}

5.執行結果:

正在學習中。。。。。。

正在睡覺中。。。。。。

6.學習總結:

(1)之所以不在originator裡面儲存乙個memento的引用來儲存其狀態,是因為這樣會產生內聚性,而我們只是生成乙個memento物件,用caretaker來對其進行儲存。這樣的話,其相互依賴關係會寬鬆一點。

(2)在memento裡面,其建構函式之所以要帶state引數,是為了後面creatememento()裡面返回乙個memento時比較方便,如果不帶引數的話,此處可能就要變為:

memento m=new memento();

m.setstate(state);

return m;

可以明顯地看到,這樣比較麻煩,還不如直接帶個引數來得方便。

JAVA系列 設計模式 備忘錄模式

定義 在不破壞封裝性的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態。類圖 來自 備忘錄儲存原發起物件的內部狀態。author administrator public class memento public string getstate p...

Java設計模式之 備忘錄模式

備忘錄模式是一種行為模式,該模式用於儲存物件當前的狀態,並且在之後可以再次恢復到此狀態,這有點像我們平時說的 後悔藥 備忘錄模式實現的方式需要保證被儲存的物件狀態不嗯呢該被物件從外部訪問,目的是為了保護號被儲存的這些物件狀態的完整性以及內部實現不向外暴露。在不破壞封閉的前提下,捕獲乙個物件的內部狀態...

Java學習 設計模式 備忘錄模式

備忘錄模式儲存乙個物件的某個狀態,以便在適當的時候恢復物件。備忘錄模式屬於行為型模式。優點 1 給使用者提供了一種可以恢復狀態的機制,可以使使用者能夠比較方便地回到某個歷史的狀態。2 實現了資訊的封裝,使得使用者不需要關心狀態的儲存細節。缺點 消耗資源。如果類的成員變數過多,勢必會占用比較大的資源,...