国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

iOS設計模式之備忘錄模式

2019-11-14 18:33:52
字體:
來源:轉載
供稿:網友

備忘錄模式

基本理解

  • 這個模式有三個關鍵角色:原發器(Originator)、備忘錄(Memento)、看管人(caretaker)。三者的基本關系是:原發器創建一個包含其狀態的備忘錄,并傳給看管人。看管人不知道如何與備忘錄交互,但會把備忘錄放在一個安全之處保管好。
  • 備忘錄(Memento):在 不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。這樣以后就可以將該對象回復到原先保存的狀態。
  • Originator(發起人):負責創建一個備忘錄,用以記錄當前時刻它的內部狀態,并且可使用恢復備忘錄內部狀態。Originator可根據需要決定Memento存儲Originator的哪些內部狀態。
  • Memento(備忘錄):負責存儲Originator對象的內部狀態,并可防止Originator以外的其他對象訪問備忘錄。備忘錄有兩個接口,CareTaker
    只能看到備忘錄的窄接口,它只能將備忘錄傳給其他對象。originator能夠看到一個寬接口,允許它訪問返回到先前狀態所需的所有數據。
  • Caretaker(管理者):負責保存好備忘錄,不能對備忘錄的內容進行操作或檢查。
  • 就是把要保存的細節給封裝在了Memento中,哪一天要更改保存的細節也不用影響客戶端了。

備忘錄使用場合

  • 備忘錄模式比較適用于功能比較復雜的,但需要維護或記錄屬性歷史的類,或者需要保存的屬性只是眾多屬性中的一小部分時,Orignator可以根據保存的Memento信息還原到前一狀態。
  • 如果在某個系統中使用命令模式時,需要實現命令的撤銷功能,那么命令模式可以使用備忘錄模式來存儲撤銷操作的狀態。有的時候一些對象的內部信息必須要保存在對象以外的地方,但是必須要由對象自己讀取,這時,使用備忘錄可以把復雜的對象內部信息對其他的對象屏蔽起來。
  • 用于獲取狀態的接口會暴露實現接口,需要將其屏蔽起來。
  • 它一般應用于游戲、文字處理程序的設計中,這種程序需要保存當前上下文的復雜狀態的快照并在以后恢復處理。

作用

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

Cocoa Touch框架中的備忘錄模式

  • Cocoa Touch框架在歸檔、屬性列表序列化和核心數據采用了備忘錄模式。

    • Cocoa的歸檔是對對象以及其屬性還有同其他對象間的關系進行編碼,形成一個文檔,該文檔既可保存與文件系統中,也可在進程或網絡間傳送。對象與其他對象的關系被看做對象圖的網絡。
    • 歸檔過程把對象保存為一種與架構無關的字節流,保持對象的標識以及對象之間的關系。對象的類型也同數據一起保存。從字節流解碼出來的對象通常用于對象編碼時相同的類進行實例化。使用NSCoder的具體類NSKeyedArchiver和NSKeyedUnarchiver,使用基于鍵的歸檔技術,被編碼與解碼的對象必須遵守NSCoding協議并實現以下方法:

    -(id)initWithCoder:(NSCoder *)coder;
    -(void)encodeWithCoder:(NSCoder *)coder;

例子

該例子就是通過備忘錄模式來保存Student的實例stu1更改名字和地址之前的原名字和地址。然后stu1恢復原來的名字和地址。具體代碼如下:
Caretaker.h

////  Caretaker.h//  memoDemo////  Created by zhanggui on 15/8/8.//  Copyright (c) 2015年 zhanggui. All rights reserved.//#import <Foundation/Foundation.h>@class Memo;@interface Caretaker : NSObject@PRoperty(nonatomic,strong) Memo *memo;@end

Caretaker.m

////  Caretaker.m//  memoDemo////  Created by zhanggui on 15/8/8.//  Copyright (c) 2015年 zhanggui. All rights reserved.//#import "Caretaker.h"@implementation Caretaker@end

上面這個是看管人。
Memo.h

////  Memo.h//  memoDemo////  Created by zhanggui on 15/8/8.//  Copyright (c) 2015年 zhanggui. All rights reserved.//#import <Foundation/Foundation.h>@interface Memo : NSObject{    NSString *tempname;    NSString *tempaddress;}-(Memo *)initWithName:(NSString *)name andWithAddress:(NSString *)address;-(NSString *)getName;-(NSString *)getAddress;@end

Memo.m

////  Memo.m//  memoDemo////  Created by zhanggui on 15/8/8.//  Copyright (c) 2015年 zhanggui. All rights reserved.//#import "Memo.h"@implementation Memo-(Memo *)initWithName:(NSString *)name andWithAddress:(NSString *)address{    tempname = name;    tempaddress = address;    return self;}-(NSString *)getAddress{    return tempaddress;}-(NSString *)getName{    return tempname;}@end

上面這個是備忘錄。
Student.h

////  Student.h//  memoDemo////  Created by zhanggui on 15/8/8.//  Copyright (c) 2015年 zhanggui. All rights reserved.//#import <Foundation/Foundation.h>@class Memo;@interface Student : NSObject@property(nonatomic,strong)NSString *myName;@property(nonatomic,strong)NSString *address;-(Memo *)createMemo;-(void)setMemo:(Memo *)memo;-(void)display;@end

Student.m

////  Student.m//  memoDemo////  Created by zhanggui on 15/8/8.//  Copyright (c) 2015年 zhanggui. All rights reserved.//#import "Student.h"#import "Memo.h"@implementation Student-(Memo *)createMemo {    return [[Memo alloc] initWithName:_myName andWithAddress:_address];}-(void)setMemo:(Memo *)memo{    _myName = [memo getName];    _address = [memo getAddress];}-(void)display{    NSLog(@"State is name:%@;address:%@",_myName,_address);}@end

上面這個是Student。然后看一下具體的調用:

////  ViewController.m//  memoDemo////  Created by zhanggui on 15/8/8.//  Copyright (c) 2015年 zhanggui. All rights reserved.//#import "ViewController.h"#import "Memo.h"#import "Caretaker.h"#import "Student.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    Student *stu1 = [[Student alloc] init];    [stu1 setMyName:@"zhangsan"];    [stu1 setAddress:@"he nan xin xiang"];    [stu1 display];            //use caretaker to save old name and address    Caretaker *careTaker = [[Caretaker alloc] init];    [careTaker setMemo:[stu1 createMemo]];        //updated name and address    [stu1 setMyName:@"zhangxiaoqiang"];    [stu1 setAddress:@"bei jing san huan"];    [stu1 display];            //back to old name and address    [stu1 setMemo:[careTaker memo]];    [stu1 display];}@end

也就是把zhangsan原來的姓名和地址先保存到備忘錄中,可是過了一段時間zhangsan不行用自己的新名字和地址了,所有就通過備忘錄來還原自己的姓名和地址。

附:


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 庆城县| 江达县| 贡觉县| 五峰| 忻州市| 巴彦县| 温泉县| 秦安县| 洛宁县| 晋城| 个旧市| 辽阳市| 雷州市| 峨眉山市| 罗田县| 武山县| 崇明县| 肇东市| 六安市| 明光市| 敖汉旗| 海淀区| 万州区| 高碑店市| 三河市| 万盛区| 济宁市| 寿宁县| 永仁县| 无极县| 宁陵县| 精河县| 丹凤县| 麻阳| 环江| 德保县| 土默特左旗| 三穗县| 汾阳市| 厦门市| 都昌县|