Objective C 備忘錄模式

備忘錄(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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章