Golang设计模式——10备忘录模式
备忘录模式
定义
保存一个对象的某个状态,以便在适当的时候恢复对象。
优点
- 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
- 实现了信息的封装,使得用户不需要关心状态的保存细节。
缺点
- 消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
场景
- 浏览器回退:浏览器一般有浏览记录,当我们在一个网页上点击几次链接之后,可在左上角点击左箭头回退到上一次的页面,然后也可以点击右箭头重新回到当前页面
- 数据库备份与还原:一般的数据库都支持备份与还原操作,备份即将当前已有的数据或者记录保留,还原即将已经保留的数据恢复到对应的表中
- 编辑器撤销与重做:在编辑器上编辑文字,写错时可以按快捷键 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观察者模式