iOS设计模式--备忘录设计模式与命令设计模式

何为备忘录模式?

在响应某些事件时,应用程序需要保存自身的状态,比如当用户保存文档或程序退出时。例如,游戏退出之前,可能需要保存当前会话的状态,如游戏等级、敌人数量、可用武器的种类等。游戏再次打开时,玩家可以从离开的地方接着玩。很多时候,保存程序的状态真的不需要什么特别巧妙的方法。任何简单有效的方法都可以,但是同时,保存信息应该只对原始程序有意义。原始程序应该是能够解码它所保存文档中的信息的唯一实体。这就是备忘录模式应用于游戏、文字处理等程序的软件设计中的方式,这些程序需要保存当前上下文的复杂状态的快照并在以后恢复。

备忘录模式:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先的保存状态。

何时使用备忘录模式?

当同时满足以下两个条件时,应当考虑使用这一模式:

@:需要保存一个对象(或某部分)在某一个时刻的状态,这样以后就可以恢复到先前的状态。

@:用于获取状态的接口会暴漏实现的细节,需要将其隐藏起来。

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://[email protected]/guoshimeihua/MemoryAndCommandDemo.git

本篇文章备忘录模式与命令模式就写到这里了。

时间: 2024-12-14 05:31:15

iOS设计模式--备忘录设计模式与命令设计模式的相关文章

[设计模式]Netd中的命令设计模式,NetworkManagementService中的监听者模式

命令模式中有如下的角色: (1)调用者(invoker) (2)命令接收者(receiver) (3)客户端(client) (4)命令对象(command) 1 public interface Command { 2 public void execute(); 3 } 4 public class ConcreteCommand implements Command { 5 6 private Receiver receiver = null; 7 private String state

IOS设计模式之四(备忘录模式,命令模式)

本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq)翻译,如果你发现有什么错误,请与我联系谢谢. 备忘录(Memento)模式 备忘录模式快照对象的内部状态并将其保存到外部.换句话说,它将状态保存到某处,过会你可以不破坏封装的情况下恢复对象的状态,也就是说原来对象中的私有数据仍然是私有的. 如何使用备忘录模式 在ViewController.m中增加

iOS常用设计模式——命令设计模式

命令设计模式详解 命令设计模式详解 基本概念 NSInvocation的使用 命令模式的体现 基本概念 命令设计模式将一个请求或行动作封装为对象.这个封装请求比原始的请求要灵活并且可以在对象之前被传递,存储,动态修改或者放进队列里面.苹果公司实现这种模式使用Target-Action机制和Invocation. NSInvocation的使用 在 iOS中可以直接调用 某个对象的消息 方式有2种 一种是performSelector:withObject:再一种就是NSInvocation第一种

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

什么是备忘录模式? 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样就可以将以后的对象状态恢复到先前保存的状态. 我们在编程的时候,经常需要保存对象的中间状态,当需要的时候,可以恢复到这个状态.比如,我们使用Eclipse进行编程时,假如编写失误(例如不小心误删除了几行代码),我们希望返回删除前的状态,便可以使用Ctrl+Z来进行返回.这时我们便可以使用备忘录模式来实现. 代码示例: 代码演示了一个单状态单备份的例子,逻辑非常简单:Originator类中的sta

【C#设计模式-备忘录模式】

一.备忘录模式的定义: 在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 二.备忘录模式的结构和角色: 1.Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态.Originator可以根据需要决定Memento存储自己的哪些内部状态. 2.Memento(备忘录):负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问

云计算设计模式(六)——命令和查询职责分离(CQRS)模式

云计算设计模式(六)--命令和查询职责分离(CQRS)模式 隔离,通过使用不同的接口,从操作读取数据更新数据的操作.这种模式可以最大限度地提高性能,可扩展性和安全性;支持系统在通过较高的灵活性,时间的演变;防止更新命令,从造成合并在域级别上的冲突. 背景和问题 在传统的数据管理系统中,这两个命令(更新数据)和查询(请求数据),针对在一个单一的数据存储库中的相同的一组实体的执行.这些实体可以是在关系数据库中的一个或多个表,如SQL Server的行的子集. 典型地,在这些系统中,所有的创建,读取,

java设计模式--行为型模式--命令模式

1 命令模式 2 概述 3 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤消的操作. 4 5 6 适用性 7 1.抽象出待执行的动作以参数化某对象. 8 9 2.在不同的时刻指定.排列和执行请求. 10 11 3.支持取消操作. 12 13 4.支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍. 14 15 5.用构建在原语操作上的高层操作构造一个系统. 16 17 18 参与者 19 1.Command 20 声明执行操作的接口.

命令设计模式

命令设计模式:将一个操作封装到对象中,然后创建多个这种带有不同操作的对象(它们都执行了一个相同接口)并将它们封装到一个类中,然后该类根据不同的入参调用不同的对象执行其对应的操作. 命令设计模式与策略模式的区别 -- 相同点: -- 毫无疑问,第一个相同点肯定是:封装变化.策略模式封装算法的变法,命令模式封装请求的变化. -- 都使用组合来实现功能,达到解耦的目的. -- 如果我们将命令模式做更高层次上的抽象,可以将它看成是一种策略模式.如:我们将Client与 Invoker封装到一起,将Con

我的设计模式:备忘录模式

我的设计模式-备忘录模式 恢复到最初的状态-->对原始状态的保留和恢复 联想到的业务:cms稿件放入到回收站,永久记录状态得用到数据库啊,怎么办?备忘录模式的内存缓存不适用? 类的单一职责 boy职责:状态   改变状态  设置状态  获取状态 备忘录职责:记录当前的状态   恢复状态 迪 米特原则:最少知道原则,不和陌生人说话 问题:备忘录只是记录了一个节点,多个备忘录记录了多个节点,可以恢复到任意节点?备忘录因该支持多个节点? 思考问题:增加备忘录管理者manager角色,有啥好处呢?没体验