何为备忘录模式?ios
在响应某些事件时,应用程序须要保存自身的状态,好比当用户保存文档或程序退出时。例如,游戏退出以前,可能须要保存当前会话的状态,如游戏等级、敌人数量、可用武器的种类等。游戏再次打开时,玩家能够从离开的地方接着玩。不少时候,保存程序的状态真的不须要什么特别巧妙的方法。任何简单有效的方法均可以,可是同时,保存信息应该只对原始程序有意义。原始程序应该是可以解码它所保存文档中的信息的惟一实体。这就是备忘录模式应用于游戏、文字处理等程序的软件设计中的方式,这些程序须要保存当前上下文的复杂状态的快照并在之后恢复。git
备忘录模式:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象以外保存这个状态。这样之后就可将该对象恢复到原先的保存状态。github
什么时候使用备忘录模式?网络
当同时知足如下两个条件时,应当考虑使用这一模式:架构
@:须要保存一个对象(或某部分)在某一个时刻的状态,这样之后就能够恢复到先前的状态。框架
@:用于获取状态的接口会暴漏实现的细节,须要将其隐藏起来。函数
Cocoa Touch框架中的备忘录模式编码
Cocoa Touch框架在归档、属性列表序列化和核心数据中采用了备忘录模式。Cocoa的归档是对对象及其属性还有同其余对象间的关系进行编码,造成一个文档,该文档既能够保存于文件系统,也能够在进程或网络间传送。对象与其余对象的关系被看作对象图的网络。归档过程把对象保存为一种与架构无关的字节流,保持对象的标识以及对象之间的关系。对象的类型也同数据一块儿保存。从字节流解码出来的对象一般用与对象编码时相同的类型进行实例化。spa
若是想归档一个对象,不少时候咱们是考虑保存程序的状态。在模型-视图-控制器范式中,程序的状态一般由模型对象来进行维护。咱们把模型对象编码到文档,而后再对其解码读回来。在运行时使用NSCoder对象进行编码与解码操做。NSCoder自己是个抽象类。苹果公司建议经过NSCoder的具体类NSKeyArchiver和NSKeyedUnarchiver,使用基于键的归档技术。被编码与解码的对象必须遵照NSCoding协议并实现如下方法:设计
- (void)encodeWithCoder:(NSCoder *)aCoder; - (id)initWithCoder:(NSCoder *)aDecoder;
何为命令模式?
命令对象封装了如何对目标执行命令的信息,所以客户端或调用者没必要了解目标的任何细节,却仍能够对它执行任何已有的操做。经过把请求封装成对象,客户端能够把参数化并置入队列或日志中,也可以支持可撤销的操做。命令对象将一个或多个动做绑定到特定的接收器。命令模式消除了做为对象的动做和执行它的接收器之间的绑定。
命令模式:将请求封装为一个对象,从而可用不一样的请求对客户进行参数化,对请求队列或记录请求日志,以及支持可撤销的操做。
什么时候使用命令模式?
在如下情形,天然会考虑使用这一模式。
@:想让应用程序支持撤销与恢复。
@:想用对象参数化一个动做以执行操做,并用不一样的命令对象来代替回调函数。
@:想要在不一样时刻对请求进行指定、排列和执行。
@:想记录修改日志,这样在系统故障时,这些修改能够在后来重作一遍。
@:想让系统支持事务,事务封装了对数据的一系列修改,事务能够建模为命令对象。
在Cocoa Touch框架中使用命令模式:
NSInvocation、NSUndoManage和Target-Action机制是框架中对这个模式的典型引用。
如何使用备忘录模式与命令模式,详见下面这篇文章:
http://blog.jobbole.com/48179/ (译文) http://www.raywenderlich.com/46988/ios-design-patterns (原文)
本篇文章的demo连接地址:
https://guoshimeihua@github.com/guoshimeihua/MemoryAndCommandDemo.git
本篇文章备忘录模式与命令模式就写到这里了。