源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

设计模式中的Memento备忘录模式的在iOS App开发中的运用

  • 时间:2022-08-02 12:36 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:设计模式中的Memento备忘录模式的在iOS App开发中的运用
备忘录模式。顾名思义,备忘录模式的初衷就是为了返回上一个状态而设计的。从名字看起来一目了然,好吧,还是老样子,先给出定义。 备忘录(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 定义看起来搞的很专业,其实就是保存上一个状态,以便日后恢复用。好比是在玩游戏,在打大Boss之前担心第一次打不过,先存个盘,万一玩儿完了,还可以恢复状态重新PK。 下面给出类结构图。 [img]http://files.jb51.net/file_images/article/201603/2016323164621128.jpg?2016223164638[/img] Originator(原发器):记录当前时刻的内部状态,负责定义哪些属于需要备份的状态,负责创建memento,负责从memento恢复状态。 Memento(备忘录):负责存储Originator的内部状态,在需要时提供给Originator内部状态。 Caretaker(看管人):将Memento保存在安全的地方,并负责提取。 一句话概括:Originator创建一个包含其状态的Memento交给Caretaker保管,Caretaker不知如何与Memento交互,只负责把Memento在安全的地方保存好。 从上面这张图来看,关系比较简单吧。那么备忘录模式一般都用在什么场合呢? Memento模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,Originator可以根据保存的Memento信息还原到前一状态。有时候一些对象的内部信息必须保存在对象以外的地方,但是必须要由对象自己读取,这时,使用备忘录可以把复杂的对象内部信息对其他的对象屏蔽起来。当然了,最大的作用还是在于当角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态进行复原。好啦,其实翻来覆去就是为了恢复数据用的,车轱辘话就不多说了,下面给大家简单展示一下实现的代码吧。 Objective-C代码实现: Originator:
[u]复制代码[/u] 代码如下:
//发起人:记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据。   #import <Foundation/Foundation.h> @class NimoMemento;   @interface NimoOriginator : NSObject   @property (nonatomic, copy) NSString* state;   - (NimoMemento *)createMemento; - (void)restoreMemento:(NimoMemento *)memento;   @end
[u]复制代码[/u] 代码如下:
#import "NimoOriginator.h" #import "NimoMemento.h"   @implementation NimoOriginator   - (NimoMemento *)createMemento {     NimoMemento *memento = [[NimoMemento alloc] initWithState:_state];     return memento; }   - (void)restoreMemento:(NimoMemento *)memento {     _state = memento.state; }   - (NSString *)description {     return [NSString stringWithFormat:@"State:%@", _state]; }   @end
Memento:
[u]复制代码[/u] 代码如下:
//备忘录:负责存储发起人对象的内部状态,在需要的时候提供发起人需要的内部状态。   #import <Foundation/Foundation.h>   @interface NimoMemento : NSObject   @property (nonatomic, copy, readonly) NSString *state; - (id)initWithState:(NSString *)state;   @end
[u]复制代码[/u] 代码如下:
#import "NimoMemento.h"   @interface NimoMemento()   @property (nonatomic, copy, readwrite) NSString *state;     @end
[u]复制代码[/u] 代码如下:
@implementation NimoMemento   - (id)initWithState:(NSString *)state {     if (self = [super init]) {         _state = [state copy];     }          return self; }   @end
Caretaker:
[u]复制代码[/u] 代码如下:
//管理角色:对备忘录进行管理,保存和提供备忘录。   #import <Foundation/Foundation.h> @class NimoMemento;   @interface NimoCaretaker : NSObject   @property (nonatomic, assign) NimoMemento *memento;   @end
[u]复制代码[/u] 代码如下:
// //  NimoCaretaker.m //  MementoDemo // #import "NimoCaretaker.h"   @implementation NimoCaretaker   @end
[u]复制代码[/u] 代码如下:
Client:   #import <Foundation/Foundation.h> #import "NimoOriginator.h" #import "NimoMemento.h" #import "NimoCaretaker.h"   int main(int argc, const char * argv[]) {     @autoreleasepool {                  NimoOriginator *originator = [[NimoOriginator alloc] init];         originator.state = @"Old";         NSLog(@"%@", originator);         NimoMemento *memento = originator.createMemento;                  NimoCaretaker *caretaker = [[NimoCaretaker alloc] init];         caretaker.memento = memento;         originator.state = @"New";         NSLog(@"%@", originator);                  [originator restoreMemento:[caretaker memento]];         NSLog(@"%@", originator);     }     return 0; }
运行:
2015-08-12 20:27:39.184 MementoDemo[1160:34914] State:Old
2015-08-12 20:27:39.186 MementoDemo[1160:34914] State:New
2015-08-12 20:27:39.186 MementoDemo[1160:34914] State:Old
以上通用代码运行后虽然能得到期望的结果,但是并不完美,在Menmento类的实现中,我们把state属性以及initWithState初始化方法暴露在了公共接口中,这两者本应只提供给Originator与Menmento(即对Originator与Menmento提供宽接口,对Caretaker等其他对象提供窄接口)。在C++等其他面向对象语言中,一般使用private或friend进行声明。但在Objective-C中一切都是公有的,所以需要额外的技巧来实现。 通过类扩展将state属性以及initWithState初始化方法从主接口头文件NimoMemento.h中分离:
[u]复制代码[/u] 代码如下:
// //  NimoMemento+Private.h //  MementoDemo //   #import "NimoMemento.h"   @interface NimoMemento ()   @property (nonatomic, copy, readwrite) NSString *state; - (id)initWithState:(NSString *)state;   @end
如此,只在Originator与Menmento中#import NimoMemento+Private.h,便实现了接口的私有化。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部