备忘录模式

基本理解

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

附:

  • 源码:http://pan.baidu.com/s/1hq0Fdis

转载于:https://www.cnblogs.com/zhanggui/p/4712560.html

iOS设计模式之备忘录模式相关推荐

  1. java备忘录模式应用场景_图解Java设计模式之备忘录模式

    图解Java设计模式之备忘录模式 游戏角色状态恢复问题 游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当大战Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状态. ...

  2. java之备忘录模式,java设计模式之备忘录模式

    java设计模式之备忘录模式 代码无错便是优? 简介: 在不破坏封装性的前提下 , 捕获一个对象的内部状态,并在该对象之外保存这个状态 , 这样以后就可以将该对象恢复到原先保存的状态 . 备忘录模式就 ...

  3. Alamps学习设计模式之备忘录模式(笑话:劫个色OR抢个鸡蛋版)

    //设计模式之备忘录模式(月光宝盒版),只要喊菠萝菠萝蜜,就能返回事件的原点.//至尊宝//爱你一万年 class LoverWords {// 模拟Memento     private Strin ...

  4. 设计模式之备忘录模式 转载

    https://juejin.im/post/59c8eb6951882564c5164c5f 设计模式之备忘录模式 备忘录模式 介绍 是一种行为模式 用于保存对象当前状态,并在之后恢复到此状态(后悔 ...

  5. java备忘录模式 类图,Android编程设计模式之备忘录模式详解

    本文实例讲述了Android编程设计模式之备忘录模式.分享给大家供大家参考,具体如下: 一.介绍 备忘录模式是一种行为模式,该模式用于保存对象当前状态,并且在之后可以再次恢复到此状态,这有点像我们平时 ...

  6. 设计模式之备忘录模式(Memento)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  7. 设计模式复习-备忘录模式

    #pragma once #include "stdafx.h" #include<string> #include<iostream> using nam ...

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

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  9. 『设计模式』备忘录模式(memento)下象棋,我就想悔棋怎么办

    23种设计模式+额外常用设计模式汇总 (持续更新) Memento模式的关键就是要在不破坏封装性的前提下,捕获一个对象的内部状态并在该对象之外保存这个状态.这样以后就可以利用该保存的状态实施恢复操作. ...

  10. [转]深入浅出Java设计模式之备忘录模式

    本文转自:http://dev.yesky.com/450/2070450.shtml 一.引子 俗话说:世上难买后悔药.所以凡事讲究个"三思而后行",但总常见有人做"痛 ...

最新文章

  1. 计算机科学导论链式存储,计算机科学导论3.pdf
  2. 构建springmvc+mybatis+dubbo分布式平台-dubbo简介
  3. 软件测试报告doc,软件测试报告.doc
  4. C# vs note
  5. 关于axios中'$router' of undefined问题
  6. 详解FSMO的五种角色
  7. 微信公众平台开发(五) 天气预报功能开发
  8. 复联3观影指南丨漫威宇宙里的AI黑科技
  9. 10mbps 局域网组播_80211 组播速率及组播转单播
  10. 于歆杰pdf 电路原理_buck电路原理(于歆杰 电路原理pdf)
  11. 太阳高度角/方位角计算公式
  12. RRD原理(转载的)
  13. Mysql 如何批量复制一个表数据进行增加条数
  14. 姿态估计1-10:FSA-Net(头部姿态估算)-源码无死角讲解(5)-Feature aggregation
  15. 如何用U盘启动做系统启动盘,如何重装系统
  16. element 配置全局样式 例如:为项目中所有el-dialog弹窗添加分割线
  17. Python 爬取留言板留言(二):多线程版+selenium模拟
  18. JAVA集合面试题52道
  19. java基于Springboot+vue的校园二手闲置商品交易平台系统 element
  20. jQurey基础——非常详细

热门文章

  1. deal.II链接PETSc过程记录
  2. java面向对象之封装
  3. Python实现人工神经网络逼近股票价格
  4. 此刻心情--我为什么不找女朋友
  5. 几种简单的垂直居中方式
  6. 【数据库】MySql分割字符串
  7. [转]CString类型的头文件、CString的输出、CString的常用用法
  8. 【C++标准库】字符串
  9. [Offer收割]编程练习赛42
  10. Erlang中的record与宏