備忘錄(Memento):在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態。這樣以後就可將該對象恢復到原先保存的狀態。
定義看起來搞的很專業,其實就是保存上一個狀態,以便日後恢復用。好比是在玩遊戲,在打大Boss之前擔心第一次打不過,先存個盤,萬一玩兒完了,還可以恢復狀態重新PK。
下面給出類結構圖。
從上面這張圖來看,關係比較簡單吧。那麼備忘錄模式一般都用在什麼場合呢?
Memento模式比較適用於功能比較複雜的,但需要維護或記錄屬性歷史的類,或者需要保存的屬性只是衆多屬性中的一小部分時,Originator可以根據保存的Memento信息還原到前一狀態。有時候一些對象的內部信息必須保存在對象以外的地方,但是必須要由對象自己讀取,這時,使用備忘錄可以把複雜的對象內部信息對其他的對象屏蔽起來。當然了,最大的作用還是在於當角色的狀態改變的時候,有可能這個狀態無效,這時候就可以使用暫時存儲起來的備忘錄將狀態進行復原。好啦,其實翻來覆去就是爲了恢復數據用的,車軲轆話就不多說了,下面給大家簡單展示一下實現的代碼吧。
-
Memento類接口
1
2
3
4
5
6
7
8
|
#import
<Foundation/Foundation.h> @interface
Memento: NSObject { NSString
*state; } -(Memento*)MyInit:( NSString *)stat; -( NSString *)GetState; @end |
-
Memento類實現
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#import
"Memento.h" @implementation
Memento -(Memento*)MyInit:( NSString
*)stat{ state
= stat; return
self ; } -( NSString *)GetState{ return
state; } @end |
-
Caretaker類接口
1
2
3
4
5
6
|
#import
<Foundation/Foundation.h> @class
Memento; @interface
Caretaker: NSObject @property
Memento *Mem; @end |
-
Caretaker類實現
1
2
3
4
5
6
|
#import
"Caretaker.h" #import
"Memento.h" @implementation
Caretaker @synthesize
Mem =_Mem; @end |
-
Originator類接口
1
2
3
4
5
6
7
8
9
10
11
|
#import
<Foundation/Foundation.h> @class
Memento; @interface
Originator: NSObject @property
NSString
*State; -(Memento*)CreateMemento; -( void )SetMemento:(Memento*)mem; -( void )Show; @end |
-
Originator類實現
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#import
"Originator.h" #import
"Memento.h" @implementation
Originator @synthesize
State =_State; -(Memento*)CreateMemento{ return
[[Memento alloc]MyInit:_State]; } -( void )SetMemento:(Memento
*)mem{ _State
= [mem GetState]; } -( void )Show{ NSLog (@ "State=%@" ,_State); } @end |
-
Main方法調用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#import
"Memento.h" #import
"Caretaker.h" #import
"Originator.h" int
main ( int
argc, const
char
*argv[]) { @autoreleasepool { Originator
*o = [[Originator alloc]init]; [o
setState:@ "On" ]; [o
Show]; Caretaker
*c = [[Caretaker alloc]init]; [c
setMem:[o CreateMemento]]; [o
setState:@ "Off" ]; [o
Show]; [o
SetMemento:[cMem]]; [o
Show]; } return
0; } |