备忘录模式

备忘录模式-概念

第一点:行为设计模式
第二点:用于保存对象的当前状态,并且以后可以再次恢复到此状态,通俗说法”后悔药“
第三点:需要保证被保存的对象状态不能被对象从外部访问(目的:为了保护好被保存的这些对象状态的完整性以及内部实现不向外暴露)

备忘录模式-定义

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

备忘录模式-使用

场景一:需要保存对象在某一个时刻的状态或者部分状态
场景二:如果用一个接口(协议)来让其他对象得到这些状态,将会暴露对象的实现细节并且破坏对象的封装性,一个对象不希望外界直接访问其内部状态,通过中间对象可以间接访问其内存状态

备忘录模式-角色划分

角色一(Originator):负责创建一个备忘录(与数据相关的各种业务操作),可以记录或者恢复内部状态
角色二(Memento):备忘录角色(实际被存取的对象),用于存储角色一的内部状态,并且可以防止角色一以外的对象访问角色二
角色三(Caretaker):负责存储备忘录(进行数据库的操作),不能够向外暴对备忘录内容进行操作

备忘录模式-UML类图结构

备忘录模式.png

案例

角色一:备忘录对象(需要被存取的数据)Memento

//首先:定义一个备忘录->JDQS(备忘录角色)
class JDQSMemento: NSObject {
    var point:Int
    var level:Int
    init(point:Int, level:Int) {
        self.point = point
        self.level = level
    }
}

角色二:负责创建一个备忘录 Originator

class JDQSOriginator: NSObject {

    var point:Int
    var level:Int
    
    override init() {
        self.point = 100
        self.level = 1
        super.init()
    }
    
    func play() {
        print("游戏开始了,当前进度是第\(self.level),目前的了\(self.point)分...")
        self.level += 1
        self.point += 50
        print("恭喜你升了一级...")
        print("恭喜你积分增加了50分...")
        print("当前等级是第\(self.level)级,目前得到了\(self.point)分...")
    }
    
    func exit() {
        print("-----游戏结束-----")
        print("-----退出游戏,当前等级是\(self.level)-----")
        print("-----游戏结束-----")
    }
    
    //创建
    func createMemo() -> JDQSMemento {
        return JDQSMemento(point: self.point, level: self.level)
    }
    
    //恢复
    func restore(memo:JDQSMemento) {
        print("-----恢复游戏-----")
        self.level = memo.level
        self.point = memo.point
        print("当前等级是第\(self.level)级,目前得到了\(self.point)分...")
    }
    
    func getMemoString() -> String {
        return "第\(self.level)级,积分是\(self.point)分"
    }
    
}

角色三:Caretaker(负责存取备忘录、进行数据库的操作)

//最后:定义一个负责存储备忘录
class JDQSCaretaker: NSObject {
    
    //内存缓存
    private var memo:JDQSMemento?
    
    func write(memo:JDQSMemento) {
        //写入数据库
        self.memo = memo
    }
    
    func read() -> JDQSMemento {
        //数据库读取
        return self.memo!
    }
    
}

外部调用:

        //测试(备忘录管理器)
        let org = JDQSOriginator()
        org.play()
        //存档
        let care = JDQSCaretaker()
        //备忘录
        let memo = org.createMemo()
        care.write(memo: memo)
        //退出游戏
        org.exit()
        //恢复游戏
        let orgRestore = JDQSOriginator()
        orgRestore.restore(memo: memo)

你可能感兴趣的:(备忘录模式)