Swift设计模式之备忘录模式
2016-05-12 11:42
417 查看
转自
Swift设计模式
原文
Design-Patterns-In-Swift
Swift设计模式
原文
Design-Patterns-In-Swift
// 备忘录模式 // 百度百科:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态 // 设计模式分类:行为型模式 import Foundation typealias Memento = Dictionary<NSObject, AnyObject> let DPMementoKeyChapter = "com.valve.halflife.chapter" let DPMementoKeyWeapon = "com.valve.halflife.weapon" let DPMementoGameState = "com.valve.halflife.state" /// 游戏状态 class GameState { var chapter: String = "" var weapon: String = "" /** 生成游戏存档 - returns: 存档 */ func toMemento() -> Memento { return [ DPMementoKeyChapter:chapter, DPMementoKeyWeapon:weapon ] } /** 恢复游戏存档 - parameter memento: 存档 */ func restoreFromMemento(memento: Memento) { chapter = memento[DPMementoKeyChapter] as? String ?? "n/a" weapon = memento[DPMementoKeyWeapon] as? String ?? "n/a" } } /** 存档点 */ enum CheckPoint { /** 保存存档 - parameter memento: 存档 - parameter keyName: 存档名 */ static func saveState(memento: Memento, keyName: String = DPMementoGameState) { // let defaults = NSUserDefaults.standardUserDefaults() // defaults.setObject(memento, forKey: keyName) // defaults.synchronize() DB.set(keyName, obj: memento) } /** 读取存档 - parameter keyName: 存档名 - returns: 存档 */ static func restorePreviousState(keyName keyName: String = DPMementoGameState) -> Memento { // let defaults = NSUserDefaults.standardUserDefaults() // // return defaults.objectForKey(keyName) as? Memento ?? Memento() let m = DB.get(keyName) return m as? Memento ?? Memento() } } class DB { static var dict:Dictionary<String, AnyObject> = [:] class func set(key: String, obj: AnyObject) { dict[key] = obj } class func get(key: String) -> AnyObject? { return dict[key] } } func printGameStateInfo(state: GameState) -> Void { print("当前游戏状态:[chapter = \(state.chapter), weapon = \(state.weapon)]") } var gameState = GameState() gameState.restoreFromMemento(CheckPoint.restorePreviousState()) // 新游戏 printGameStateInfo(gameState) gameState.chapter = "第一章 新手上路" gameState.weapon = "木剑" CheckPoint.saveState(gameState.toMemento()) // 第一个存档 printGameStateInfo(gameState) gameState.chapter = "第二章 冒险开始" gameState.weapon = "铜剑" gameState.restoreFromMemento(CheckPoint.restorePreviousState()) // 恢复存档 printGameStateInfo(gameState) gameState.chapter = "第三章 挑战魔龙" gameState.weapon = "铁剑" CheckPoint.saveState(gameState.toMemento(), keyName: "gameState2") // 第二个存档 printGameStateInfo(gameState) gameState.chapter = "最后章 最终之战" gameState.weapon = "圣剑" CheckPoint.saveState(gameState.toMemento()) // 覆盖第一个存档 printGameStateInfo(gameState) gameState.restoreFromMemento(CheckPoint.restorePreviousState(keyName: "gameState2")) // 加载第二个存档 printGameStateInfo(gameState)
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- Apple Swift学习教程
- 浅谈设计模式的学习
- 介绍 Fedora 上的 Swift
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解