备忘录模式
定义
保存一个对象的某个状态,以便在适当的时候恢复对象。
优点
- 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
- 实现了信息的封装,使得用户不需要关心状态的保存细节。
缺点
- 消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
场景
- 浏览器回退:浏览器一般有浏览记录,当我们在一个网页上点击几次链接之后,可在左上角点击左箭头回退到上一次的页面,然后也可以点击右箭头重新回到当前页面
- 数据库备份与还原:一般的数据库都支持备份与还原操作,备份即将当前已有的数据或者记录保留,还原即将已经保留的数据恢复到对应的表中
- 编辑器撤销与重做:在编辑器上编辑文字,写错时可以按快捷键 Ctrl + z 撤销,撤销后可以按 Ctrl + y 重做
- 虚拟机生成快照与恢复:虚拟机可以生成一个快照,当虚拟机发生错误时可以恢复到快照的样子
代码
package Memento type Memento struct { state int } func NewMemento(value int) *Memento { return &Memento{value} } type Number struct { value int } func NewNumber(value int) *Number { return &Number{value} } func (n *Number) Double() { n.value = 2 * n.value } func (n *Number) Half() { n.value = n.value / 2 } func (n *Number) Value() int { return n.value } func (n *Number) CreateMemento() *Memento { return NewMemento(n.value) } func (n *Number) ReinstateMemento(memento *Memento) { n.value = memento.state }
package Memento import ( "fmt" "testing" ) func TestNumber_ReinstateMemento(t *testing.T) { n := NewNumber(7) n.Double() n.Double() memento := n.CreateMemento() n.Half() n.ReinstateMemento(memento) fmt.Println(n.value) }
其他设计模式
设计模式Git源代码
00简单工厂模式
01工厂方法模式
02抽象工厂模式
03外观模式
04建造者模式
05桥接模式
06命令模式
07迭代器模式
08模板模式
09访问者模式
10备忘录模式
11责任链模式
12中介模式
13原型模式
14状态模式
15策略模式
16享元模式
17组合模式
18解释器模式
19单例模式
20适配器模式
21代理模式
22装饰器模式
23观察者模式