golang设计模式之备忘录模式
备忘录模式
定义
备忘录( Memento ):在不破坏封装性的前提下,获取一个对象的内部状态,并在该对象之处保存该状态。这样以后就可将该对象恢复到原先保存的状态。
这个模式的意图很明确,主要是用来防丢失、撤销、恢复等。
优点
1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态;
2、实现了信息的封装,使得用户不需要关心状态的保存细节。
缺点
消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
适用范围
1、需要保存/恢复数据的相关状态场景;
2、提供一个可回滚的操作。
代码实现
比如我们看视频,比如看了一半,退出观看,下次打开就还能回到观看的位置。
type Memento interface{} type Video struct { time int } type videoMemento struct { time int } func (v *Video) Watch(time int) { v.time += time } func (v *Video) Save() Memento { return &videoMemento{ time: v.time, } } func (v *Video) Load(m Memento) { gm := m.(*videoMemento) v.time = gm.time } func (v *Video) Status() string { return fmt.Sprintf("video watch time:%d", v.time) }
测试代码
func TestVideo_Watch(t *testing.T) { video := &Video{ time: 10, } t.Log(video.Status()) progress := video.Save() video.Watch(30) t.Log(video.Status()) video.Load(progress) t.Log(video.Status()) }