随笔 - 308  文章 - 0  评论 - 84  阅读 - 75万

设计模式学习-使用go实现备忘录模式

备忘录模式

定义

备忘录( 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())
}

参考

【文中代码】https://github.com/boilingfrog/design-pattern-learning/tree/master/备忘录模式
【大话设计模式】https://book.douban.com/subject/2334288/
【极客时间】https://time.geekbang.org/column/intro/100039001
【设计模式】https://github.com/senghoo/golang-design-pattern
【备忘录模式】https://boilingfrog.github.io/2021/11/27/使用go实现备忘录模式/

posted on   ZhanLi  阅读(107)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示