备忘录模式(Memento)是指在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态.
![](https://img.haomeiwen.com/i1048365/c465289e573b0fcd.png)
Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。Originator可以根据需要决定Memento存储自己的哪些内部状态.
Memento(备忘录):负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录.
Caretaker(管理者):负责备忘录Memento,不能对Memento的内容进行访问或者操作.
备忘录在棋类游戏(悔棋),普通软件(撤销操作),数据库软件中的(事务管理的回滚操作) 和Photoshop软件中体现比较多.代码实现比较简单,以游戏存档为例.
<pre><code>`class Game {
var time:Float = 0
var pattern:String = ""
var progress:Float = 0
func saveMemento() -> Memento {
return Memento(pattern: self.pattern, progress: self.progress)
}
}`</code></pre>
<pre><code>`class Memento {
var pattern:String = ""
var progress:Float = 0
convenience init(pattern:String,progress:Float) {
self.init()
self.pattern = pattern
self.progress = progress
}
}`</code></pre>
<pre><code>`class Caretaker {
var memento:Memento?
}`</code></pre>
测试代码:
<pre><code>` 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)")`</code></pre>
备忘录模式优点:
1.状态恢复机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原.
2.信息的封装,一个备忘录对象是一种原发器对象状态的表示,不会被其他代码所改动。备忘录保存了原发器的状态,采用列表、堆栈等集合来存储备忘录对象可以实现多次撤销操作.
缺点:
资源消耗过大,如果需要保存的原发器类的成员变量太多,就不可避免需要占用大量的存储空间,每保存一次对象的状态都需要消耗一定的系统资源.
网友评论