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不行用自己的新名字和地址了,所有就通过备忘录来还原自己的姓名和地址。
附:
iOS设计模式之备忘录模式的更多相关文章
- iOS 设计模式之工厂模式
iOS 设计模式之工厂模式 分类: 设计模式2014-02-10 18:05 11020人阅读 评论(2) 收藏 举报 ios设计模式 工厂模式我的理解是:他就是为了创建对象的 创建对象的时候,我们一 ...
- 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern)
原文:乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) 作者:webabc ...
- 折腾Java设计模式之备忘录模式
原文地址:折腾Java设计模式之备忘录模式 备忘录模式 Without violating encapsulation, capture and externalize an object's int ...
- C#设计模式:备忘录模式(Memento Pattern)
一,C#设计模式:备忘录模式(Memento Pattern) 1.发起人角色(Originator):记录当前时刻的内部状态,负责创建和恢复备忘录数据.负责创建一个备忘录Memento,用以记录当前 ...
- js设计模式——7.备忘录模式
js设计模式——7.备忘录模式 /*js设计模式——备忘录模式*/ // 备忘类 class Memento { constructor(content) { this.content = conte ...
- java设计模式之备忘录模式
备忘录模式 备忘录模式是一种软件设计模式:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.一听到备忘录这个字的时候想起了小小时打的游 ...
- 【GOF23设计模式】备忘录模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_备忘录模式.多点备忘.事务操作.回滚数据底层架构 package com.test.memento; /** * 源发器类 ...
- [设计模式] 18 备忘录模式Memento Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对备忘录模式是这样说的:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存 ...
- 再起航,我的学习笔记之JavaScript设计模式24(备忘录模式)
备忘录模式 概念介绍 备忘录模式(Memento): 在不破坏对象的封装性的前提下,在对象之外捕获并保存该对象内部的状态以便日后对象使用或者对象恢复到以前的某个状态. 简易分页 在一般情况下我们需要做 ...
随机推荐
- 自己动手搭建 CAS(Central Authentication Service) 环境,为了单点登录(Single Sign On , 简称 SSO )
介绍 刚刚搭建 CAS 成功了,现在记录下来,怕以后忘记,同时也给需要帮助的人.CAS 搭建需要服务端和客户端,服务端是 Java 写的,如果自己搭建则需要安装与配置 Java 环境.客户端可以是多种 ...
- [Code::Blocks] Install wxWidgets & openCV
The open source, cross platform, free C++ IDE. Code::Blocks is a free C++ IDE built to meet the most ...
- spring源码分析之spring-web remoting模块概况及基本概念
spring-web总体分为三部分:caucho.httpinvoker.jaxws,其总体构造图如下: uml结构: 先看看网上搜索到的上述实现的原理吧:Spring RMI,Hessian/Bur ...
- Dictionary序列化和反序列化
public class SerializeHelper { public static string XmlSerialize(List<CustomSearchEntity> obj) ...
- P6 EPPM R16.1安装与配置指南(一)
标题 http://www.cnblogs.com/endv/p/5634620.html 安装与配置指南安装与配置指南(数据库)说明哪些How to set up the P6专业数据库和服务器.a ...
- 百度地图刷新显示不完整?(应该是和div顺序有关系)
解决方案:1异步加载(jquery(function(){loadJScript():})) 2解析加载设置了个延迟(setTimeOut(getInit,1000))
- MyEclipse+Mysql (二)
上一节介绍了如何在Myeclipse中连接mysql 这一节介绍如何在java程序中访问mysql数据库中的数据b并进行简单的操作 创建一个javaProject,并输入如下java代码: packa ...
- Eclipse 出现Some sites could not be found. See the error log for more detail.错误 解决方法
Eclipse 出现Some sites could not be found. See the error log for more detail.错误 解决方法 Some sites could ...
- SQL数据库基础(七)
主键 数据库主键是指表中一个列或列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称为表的主键,通过它可强制表的实体完整性.当创建或更改表时可通过定义 PRIMARY KEY约束来创建主键.一个 ...
- iphone 使用 soap 服务 介绍
iphone 使用 soap 服务 介绍 目前比较常用的有几个办法: 1. WSDL to Objective C自动根据wsdl文件生成ios可以直接调用的Objective-C (Cocoa) 代 ...