iOS设计模式之备忘录模式

备忘录模式

基本理解

  • 这个模式有三个关键角色:原发器(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不行用自己的新名字和地址了,所有就通过备忘录来还原自己的姓名和地址。

时间: 2024-08-07 06:53:39

iOS设计模式之备忘录模式的相关文章

乐在其中设计模式(C#) - 备忘录模式(Memento Pattern)

原文:乐在其中设计模式(C#) - 备忘录模式(Memento Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) 作者:webabcd 介绍 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到保存的状态. 示例 有一个Message实体类,某个对象对它的操作有Insert()方法,只有在插入时间符合要求的情况下才能插入成功,因此要求可以保存和恢复Message对象的状态,插入失败

【设计模式】—— 备忘录模式Memento

模式意图 这个模式主要是想通过一个对象来记录对象的某种状态,这样有利于在其他需要的场合进行恢复. 该模式还有跟多可以扩展的地方,比如可以记录多个时间的状态,每个角色都有可以扩展的空间,完全看业务场景而定. 应用场景 1 保存对象某一时刻的状态 2 避免直接暴露接口,破坏封装性 模式结构 Originator 是备忘录的发起者,记录状态的对象 class Originator{ private String state; public Memento ceateMemento() { return

设计模式:备忘录模式(Memento)

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将对象恢复到原先保存的状态. 备忘录模式的角色: 1. 原发器(Originator):负责创建一个备忘录,用以记录当前对象的内部状态,通过也可以使用它来利用备忘录回复内部状态.同时原发器还可以根据需要决定Memento存储Originator的那些内部状态. 2. 备忘录(Memento):用于存储Originator的内部状态,并且可以防止Originator以外的对象访问Memento.在备忘录Meme

C++设计模式之备忘录模式_C 语言

前言 又到年底了,也静不下心来写代码了,大家都很浮躁:翻出经典的<仙剑奇侠传>玩一会:又要打大BOSS,先存一下档吧.这是我的习惯,在打大BOSS之前,都要先存一下档,要是打赢了,就再存一个档,覆盖之前的:如果打输了,就恢复之前的存档,接着重来.我想大家都是这么玩的吧.哎呀,总是打不过.好了,不玩了,但是,游戏中的那个存档行为却让我很着迷,它是如何实现的呢?带着好奇的心,去百度了一下:哦,原来如此.好吧,开始今天的总结吧--备忘录模式. 备忘录模式 在GOF的<设计模式:可复用面向对象软

详解Java设计模式之备忘录模式的使用_java

定义与结构     备忘录(Memento)模式又称标记(Token)模式.GOF给备忘录模式的定义为:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 在讲命令模式的时候,我们曾经提到利用中间的命令角色可以实现undo.redo的功能.从定义可以看出备忘录模式是专门来存放对象历史状态的,这对于很好的实现undo.redo功能有很大的帮助.所以在命令模式中undo.redo功能可以配合备忘录模式来实现. 其实单就实现保存一个对

Head First设计模式之备忘录模式

一.定义 不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样就可以将该对象恢复到原先保存的状态 二.结构 备忘录模式中主要有三类角色: 发起人角色:记录当前时刻的内部状态,负责创建和恢复备忘录数据. 备忘录角色:负责存储发起人对象的内部状态,在进行恢复时提供给发起人需要的状态. 管理者角色:负责保存备忘录对象,但是不能对备忘录对象的内容进行操作或检查. 三.适用场景 1.需要保存/恢复数据的相关状态场景. 2.提供一个可回滚的操作. 四.优缺点 优点:  1.给用户提

设计模式之备忘录模式

        备忘录模式:                     在不破坏封装性的前提下,铺货一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.          备忘录模式结构图:                                           Originator(原生者): 需要被保存状态以便恢复的那个对象.                 Memento(备忘录) : 该对象由Originator创建,主要用来保存Origi

设计模式——19备忘录模式(Memento)

19.备忘录模式(Memento)主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象,个人觉得叫备份模式更形象些,通俗的讲下:假设有原始类A,A中有各种属性,A可以决定需要备份的属性,备忘录类B是用来存储A的一些内部状态,类C呢,就是一个用来存储备忘录的,且只能存储,不能修改等操作. Original类是原始类,里面有需要保存的属性value及创建一个备忘录类,用来保存value值.Memento类是备忘录类,Storage类是存储备忘录的类,持有Memento类的实例,该模式很好理解.

iOS设计模式之命令模式

命令模式 基本理解 命令模式(Command),将一个请求封装为一个对象,从而使你可用不同的请求对客户端进行参数化:对请求队列或记录请求日志,以及支持客可撤离的操作. 苹果的Target-Action调用机制已经实现了命令模式.NSInvocation包含一个target对象,一个方法和一些参数.这个对象可以按需要动态修改.这是一个非常好的命令模式的例子.减少对象和接收对象之间的操作,直接写成一个请求或请求链. 命令模式的优点 它能够容易地设计一个命令队列 在需要的情况相爱,可以较容易地将命令记