标签:
何为备忘录模式?
在响应某些事件时,应用程序需要保存自身的状态,比如当用户保存文档或程序退出时。例如,游戏退出之前,可能需要保存当前会话的状态,如游戏等级、敌人数量、可用武器的种类等。游戏再次打开时,玩家可以从离开的地方接着玩。很多时候,保存程序的状态真的不需要什么特别巧妙的方法。任何简单有效的方法都可以,但是同时,保存信息应该只对原始程序有意义。原始程序应该是能够解码它所保存文档中的信息的唯一实体。这就是备忘录模式应用于游戏、文字处理等程序的软件设计中的方式,这些程序需要保存当前上下文的复杂状态的快照并在以后恢复。
备忘录模式:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先的保存状态。
何时使用备忘录模式?
当同时满足以下两个条件时,应当考虑使用这一模式:
@:需要保存一个对象(或某部分)在某一个时刻的状态,这样以后就可以恢复到先前的状态。
@:用于获取状态的接口会暴漏实现的细节,需要将其隐藏起来。
Cocoa Touch框架中的备忘录模式
Cocoa Touch框架在归档、属性列表序列化和核心数据中采用了备忘录模式。Cocoa的归档是对对象及其属性还有同其他对象间的关系进行编码,形成一个文档,该文档既可以保存于文件系统,也可以在进程或网络间传送。对象与其他对象的关系被看做对象图的网络。归档过程把对象保存为一种与架构无关的字节流,保持对象的标识以及对象之间的关系。对象的类型也同数据一起保存。从字节流解码出来的对象通常用与对象编码时相同的类型进行实例化。
如果想归档一个对象,很多时候我们是考虑保存程序的状态。在模型-视图-控制器范式中,程序的状态通常由模型对象来进行维护。我们把模型对象编码到文档,然后再对其解码读回来。在运行时使用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
本篇文章备忘录模式与命令模式就写到这里了。
标签:
原文地址:http://my.oschina.net/u/1792456/blog/493278