溫故知新(8) 備忘錄模式

2022-05-12 08:18:06 字數 3619 閱讀 8561

先從物件導向的三大特徵之一封裝說起。物件導向的封裝簡單點說就是把狀態(資料)和行為(操作這些資料的方法)放到一起,構成乙個單元,通常叫做類。乙個物件的行為是事先確定好的(靜態)一些指令碼,如果物件的狀態相同,物件看起來就是一樣的。所以當我們需要把乙個物件的某一時刻儲存起來,那麼只需要儲存它在那個時刻的狀態;相反需要恢復物件到某一時刻時,只需恢復它在那個時刻的狀態。這就是備忘錄模式的原理。

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

上面是gof對備忘錄模式的意圖描述,非常清楚,內部狀態儲存到外部,再從外部恢復物件。

實現時我們通常把需要儲存起來的狀態封裝為乙個物件,用這個物件作為乙個資訊的載體,儲存或恢復。出於避免外界對這些資訊進行竄改,有必要對這個資訊載體進行乙個抽象,讓外界只知道這是乙個資訊載體,而不知道具體承載了什麼內容(窄介面);而內部可以獲得載體所載有的全部資訊(寬介面)。

備忘錄模式常用來實現「撤銷/重做」。

備忘錄模式的類圖:

模式的參與者只有三個,相對簡單。

1、作為物件狀態資訊載體的備忘錄物件——imemento、memento,其中imemento為對外的窄介面,而具體實現memento則是對內的寬介面;

2、需要儲存和恢復狀態的物件,成為原發器——originator;

3、管理和持有備忘錄的備忘錄負責人——caretaker;

有乙個電子書閱讀器,人們可以用它來閱讀電子文件。閱讀器提供了書籤的功能,使用者可以儲存書籤,也可以從使用乙個書籤使閱讀器變為建立書籤時的狀態。我們簡化一下,假設閱讀器可以從書名和書的頁碼兩個引數確定自身狀態。

上面的需求很符合備忘錄模式,書籤可以看作備忘錄物件,閱讀器可以看作原發器,而隱含的書籤管理結構可以作為負責人。

1、定義備忘錄介面ibookmark(對外窄介面)。

1:  

using system;

2:
3:  

namespace designpatterns.memento

4:
10:  }
11:
2、閱讀器類reader,同時以私有內部類的形式實現具體的備忘錄bookmark(對內寬介面)。

1:  

using system;

2:
3:  

namespace designpatterns.memento

4:
15:
16:  

//書名

17:  

private string bookname;

18:
19:  

//頁碼

20:  

private int pagenumber;

21:
22:  

//獲得乙個書籤

23:  

public

ibookmark getbookmark()

24:
28:
29:  

//從書籤恢復

30:  

public void restore(ibookmark bookmark)

31:
37:
38:  

//閱讀

39:  

public void read()

40:
44:
45:  

///

46:  

///

書籤實現(用內部類的方式實現對外的保密,或者說對內的寬介面)

47:  

///

48:  

private class

bookmark : ibookmark

49:  

55:
56:  

///

57:  

///

書名

58:  

///

59:  

public string bookname

60:
61:  

///

62:  

///

頁碼

63:  

///

64:  

public int pagenumber

65:          }
66:      }
67:  }
68:
3、書籤管理器bookmarkcaretaker。

1:  

using system;

2:  

using system.collections.generic;

3:
4:  

namespace designpatterns.memento

5:
15:
16:  

private

dictionary

bookmarks;

17:
18:  

public void addbookmark(int key, ibookmark bookmark)

19:
22:
23:  

public void removebookmark(int key)

24:
27:
28:  

public

ibookmark getbookmark(int key)

29:
32:      }
33:  }
34:
4、測試客戶端**。

1:  

using system;

2:
3:  

namespace designpatterns.memento

4:
28:      }
29:  }
30:
5、執行,檢視結果。

溫故知新 ROWTYPE

rowtype 相當於資料庫表裡的一行資料記錄的變數型別。declare 定義乙個emp表裡的一行記錄的資料型別的變數 v emp emp rowtype begin 查詢的emp表裡的資料列必須與v emp的列順序以及個數保持一致 select empno,ename,job,mgr,hireda...

vue 溫故知新

v cloak指令 解決變數閃爍問題 v if isshow 是插入或刪除節點 v show isshow 是隱藏或顯示節點 v bind data m msg 或 data m msg 繫結屬性 v bind key v.id 繫結乙個資料唯一值,用於虛擬dom演算法,優化渲染效率 v on cl...

溫故知新系列

我從事windows phone開發一年多來,終日忙於開發應用,每每有所收穫也沒有時間思考總結。最近實習即將結束,同時也看清了真實的生活,痛定思痛,決定好好整理自己所學所得,同時也靜下心來好好學習一下一直欠缺的知識。溫故而知新,可以為師矣。此番總結,不求為師,但求能看清自己,共勉共勉。此溫故知新系列...