Swift-备忘录(Memento)模式

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

Swift-备忘录(Memento)模式_第1张图片
备忘录模式.png

Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。Originator可以根据需要决定Memento存储自己的哪些内部状态.

Memento(备忘录):负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录.

Caretaker(管理者):负责备忘录Memento,不能对Memento的内容进行访问或者操作.

备忘录在棋类游戏(悔棋),普通软件(撤销操作),数据库软件中的(事务管理的回滚操作) 和Photoshop软件中体现比较多.代码实现比较简单,以游戏存档为例.

class Game {
    
    var time:Float = 0
    
    var pattern:String = ""
    
    var progress:Float = 0
    
    
    func saveMemento() -> Memento {
        return Memento(pattern: self.pattern, progress: self.progress)
    }
}
class Memento {
    
    var pattern:String = ""
    
    var progress:Float = 0
    
    convenience init(pattern:String,progress:Float) {
        self.init()
        self.pattern = pattern
        self.progress = progress
    }   
}
class Caretaker {
    
    var memento:Memento?
    
}

测试代码:

let game:Game = Game()
        game.progress = 0.2
        game.pattern = "1V1"
        game.time = 2500
        
        print("当前游戏的模式:\(game.pattern)---游戏的进度:\(game.progress)")
        
        let caretaker:Caretaker = Caretaker()
        caretaker.memento = game.saveMemento()
        
        game.progress = 0.5
        
        print("当前游戏的模式:\(game.pattern)---游戏的进度:\(game.progress)")
        
        print("备份游戏的模式:\(caretaker.memento!.pattern)---游戏的进度:\(caretaker.memento!.progress)")

备忘录模式优点:

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

2.信息的封装,一个备忘录对象是一种原发器对象状态的表示,不会被其他代码所改动。备忘录保存了原发器的状态,采用列表、堆栈等集合来存储备忘录对象可以实现多次撤销操作.

缺点:

资源消耗过大,如果需要保存的原发器类的成员变量太多,就不可避免需要占用大量的存储空间,每保存一次对象的状态都需要消耗一定的系统资源.

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