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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值