在响应某些事件时,应用程序需要保存自身的状态,比如当用户保存文档或者程序退出时。具体一点:当游戏退出之前,可能需要保存当前会话的状态,如游戏等级、敌人的数量、可用武器的种类等。当游戏再次打开时,玩家可以从离开的地方接着玩。很多时候,保存程序的状态真的不需要什么特别的方法,任何简单有效的方法都可以,但是保存的信息应该只对原始程序有意义。

模式定义

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

简单来讲,备忘录模式就是一个对象的备份模式,提供了一种程序数据的备份方法,其类图如下:

类图中的三个角色:

1、Originator发起人角色

记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录的数据。即负责创建一个 memento对象,用以记录当前时刻该对象的内部状态并可以使用备忘录恢复当前状态。

2、Memento备忘录角色

负责存储Originator发起人对象的内部状态,在需要的时候提供发起人需要的内部状态,并可以防止Originator以外的其它对象访问memento。

3、CareTaker备忘录管理员角色

对备忘录进行管理,保存和提供备忘录。

整体思路:Originator创建一个包含其状态的Memento,并交由CareTaker进行管理。

模式使用场景

1、无论什么时候你想存储和恢复对象的状态,都可以考虑使用备忘录模式。即需要保存和恢复数据的相关状态场景。

2、提供一个可回滚的操作,能够回到之前的状态。比如:ID浏览器中的后退按钮,文件管理器上的backspac等。

3、用于获取状态的接口会暴露实现接口,需要将其屏蔽起来。

iOS中的备忘录模式

在iOS中归档、属性列表序列化和核心数据都采用了备忘录模式。

模式优点

状态恢复机制,使得用户可以方便的回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用存储起来的备忘录恢复状态。

模式缺点

资源消耗过大,特别是当保存对象的成员太多,那么久不可避免的需要占用大量的存储空间,每保存一次对象都需要消耗一定的资源。

模式-Demo

简单模拟一个游戏场景,定义一个游戏类

// MARK: - Originator
public class Game: Codable {// MARK: - Mementotypealias GameMemento = Datapublic class State: Codable {public var attemptsRemaining: Int = 3public var level: Int = 1 //等级public var score: Int = 0 //分数}public var state = State()public func rackUpMassivePionts() {state.score += 9002}public func mostersEatPlayer() {state.attemptsRemaining -= 1}
}

定义一个游戏系统即CareTaker管理备忘存储

// MARK: - CareTaker
public class GameSystem {private let decoder = JSONDecoder()private let encoder = JSONEncoder()private let userDefaults = UserDefaults.standard// 封装存储逻辑public func save(_ game: Game, title: String) throws {let data = try encoder.encode(game)userDefaults.set(data, forKey: title)}// 获取存储的对象public func load(title: String) throws -> Game {guard let data = userDefaults.data(forKey: title),let game = try? decoder.decode(Game.self, from: data) else {throw Error.gameNotFound}return game}public enum Error: String, Swift.Error {case gameNotFound}
}

简单使用

var game = Game()
game.mostersEatPlayer()
game.rackUpMassivePionts()// Save Game
let gameSystem = GameSystem()
try? gameSystem.save(game, title: "Best Game Ever")// Load Game
game = try! gameSystem.load(title: "Best Game Ever")
print("load game ever: \(game.state.score)")


参考

Dessign Pattern - Memento Pattern

Design-Patterns-In-Swift

iOS - 备忘录模式(Memento Pattern)相关推荐

  1. 二十四种设计模式:备忘录模式(Memento Pattern)

    备忘录模式(Memento Pattern) 介绍 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到保存的状态. 示例 有一个Message实体类 ...

  2. java memento_备忘录模式-Memento Pattern(Java实现)

    备忘录模式-Memento Pattern Memento备忘录设计模式是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到以前保存的状态. 本文中的场景: 有一款游戏可以随时存档, ...

  3. Net设计模式实例之备忘录模式(Memento Pattern)

    一.备忘录模式简介(Brief Introduction) 备忘录模式(Memento Pattern),在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以就该对 ...

  4. 保留状态的秘密 - 深入了解Java备忘录模式(Memento Pattern)

    文章目录 一.概述 1.1 介绍备忘录模式的定义和作用 二.角色 2.1 介绍备忘录模式中的三个角色 三.实现方法 3.1 介绍备忘录模式的实现方法 3.2 分别介绍基于类和基于接口实现备忘录模式的方 ...

  5. 23.备忘录模式(Memento Pattern)

    using System; using System.Collections.Generic;namespace ConsoleApplication6 {/// <summary>/// ...

  6. 38备忘录模式(Memento Pattern)

    对象状态的回溯:     对象状态的变化无端,如何回溯/恢复对象在某个点的状态?                          动机:     在软件构建过程中,某些对象的状态在转换过程中,可能由 ...

  7. 设计模式-备忘录模式(Memento)-Java

    设计模式-备忘录模式(Memento)-Java 目录 文章目录 1.前言 2.示例案例-可悔棋的中国象棋 3.备忘录模式概述 3.1.备忘录模式定义 3.2.备忘录模式结构 3.3.备忘录模式结构图 ...

  8. 备忘录模式 Memento 快照模式 标记Token模式 行为型 设计模式(二十二)

    备忘录模式 Memento 沿着脚印,走过你来时的路,回到原点. 苦海翻起爱恨 在世间难逃避命运 相亲竟不可接近 或我应该相信是缘份 一首<一生所爱>触动了多少人的心弦,一段五百年都没有结 ...

  9. Java备忘录模式(Memento)

      本文我们来介绍下java23种设计模式中的备忘录模式. 备忘录模式Memento 使用场景 录入大批人员资料.正在录入当前人资料时,发现上一个人录错了, 此时需要恢复上一个人的资料,再进行修改. ...

最新文章

  1. 神经网络中的激活函数的作用和选择
  2. 主存和cache每一块相等_CPU中的Cache实现原理
  3. BZOJ 2822: [AHOI2012]树屋阶梯 [Catalan数 高精度]
  4. 电大c 语言程序设计程序,中央电大 C语言程序设计A
  5. 【Python】安装方法小结
  6. 最大堆和最小堆和平衡二叉树_最小堆二叉树
  7. 越做越好的adobe acrobat
  8. schema的详解2
  9. 进阶之路:Java 日志框架全画传(中)
  10. 夏普M3508U复印机无法打印的解决方法
  11. ArcGIS入门 (一)
  12. 好用的scrum敏捷开发工具有哪些?推荐3个scrum项目管理工具
  13. 计算机重启是什么原因,电脑自动重启是什么原因以及如何解决【图文教程】
  14. 杂记-Macbook Pro M1芯片能玩深度学习吗?
  15. 2023年河北医科大学临床检验诊断学考研分享
  16. 22-07-04 西安 尚好房(01)项目经验总结
  17. 已解决(Python读取xml文件报错)xmL.etree.ELementTree.ParseError:not well-formed (invalid token): Line
  18. python中断响应_Python手动中断(Ctrl-C)多线程程序
  19. Python项目演练:使用深度学习自动识别车牌号【附源代码】
  20. 分布式锁:RedLock 你这锁也不包熟啊!

热门文章

  1. 如何设置html字体
  2. 浅谈近年来各大搜索引擎平台有哪些
  3. HTTP和HTTPS的区别,有什么优缺点
  4. 由中缀表达式求后缀、前缀表达式cpp代码
  5. Java中的网络编程入门
  6. joomla后台组件菜单设置
  7. QT: 为程序加入超级管理员权限
  8. “由于找不到MSVCP140.dll,无法继续执行代码,重新安装程序可能会解决此问题等”解决方案
  9. android开发之内存CPU监控
  10. 解析世界杯超大规模直播场景下的码率控制 1