先從物件導向的三大特徵之一封裝說起。物件導向的封裝簡單點說就是把狀態(資料)和行為(操作這些資料的方法)放到一起,構成乙個單元,通常叫做類。乙個物件的行為是事先確定好的(靜態)一些指令碼,如果物件的狀態相同,物件看起來就是一樣的。所以當我們需要把乙個物件的某一時刻儲存起來,那麼只需要儲存它在那個時刻的狀態;相反需要恢復物件到某一時刻時,只需恢復它在那個時刻的狀態。這就是備忘錄模式的原理。
在不破壞封裝性的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態。上面是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開發一年多來,終日忙於開發應用,每每有所收穫也沒有時間思考總結。最近實習即將結束,同時也看清了真實的生活,痛定思痛,決定好好整理自己所學所得,同時也靜下心來好好學習一下一直欠缺的知識。溫故而知新,可以為師矣。此番總結,不求為師,但求能看清自己,共勉共勉。此溫故知新系列...