Go 备忘录模式讲解和代码示例

推荐阅读: 聊聊在生产环境中使用Docker的最佳实践 - 掘金 (juejin.cn)

Go 备忘录模式讲解和代码示例

备忘录是一种行为设计模式, 允许生成对象状态的快照并在以后将其还原。

备忘录不会影响它所处理的对象的内部结构, 也不会影响快照中保存的数据。

概念示例

备忘录模式让我们可以保存对象状态的快照。 你可使用这些快照来将对象恢复到之前的状态。 这在需要在对象上实现撤销-重做操作时非常实用。

originator.go: 原发器

go 复制代码
package main

type Originator struct {
	state string
}

// 创建快照
func (e *Originator) createMemento() *Memento {
	return &Memento{state: e.state}
}

// 回复快照
func (e *Originator) restoreMemento(m *Memento) {
	e.state = m.getSavedState()
}

func (e *Originator) setState(state string) {
	e.state = state
}

func (e *Originator) getState() string {
	return e.state
}

memento.go: 备忘录

go 复制代码
package main

type Memento struct {
	state string
}

func (m *Memento) getSavedState() string {
	return m.state
}

caretaker.go: 负责人

go 复制代码
package main

type Caretaker struct {
	mementoArray []*Memento
}

func (c *Caretaker) addMemento(m *Memento) {
	c.mementoArray = append(c.mementoArray, m)
}

func (c *Caretaker) getMemento(index int) *Memento {
	return c.mementoArray[index]
}

main.go: 客户端代码

go 复制代码
package main

import "fmt"

func main() {
	caretaker := &Caretaker{
		mementoArray: make([]*Memento, 0),
	}

	originator := &Originator{
		state: "A",
	}
	fmt.Printf("Originator Current State: %s\n", originator.getState())
	// 添加一个备忘录
	caretaker.addMemento(originator.createMemento())

	originator.setState("C")
	fmt.Printf("Originator Current State: %s\n", originator.getState())
	caretaker.addMemento(originator.createMemento())

	originator.restoreMemento(caretaker.getMemento(1))
	fmt.Printf("Restored to State: %s\n", originator.getState())

	originator.restoreMemento(caretaker.getMemento(0))
	fmt.Printf("Restored to State: %s\n", originator.getState())
}

output.txt: 执行结果

tex 复制代码
Originator Current State: A
Originator Current State: C
Restored to State: C
Restored to State: A
相关推荐
程序员爱钓鱼18 小时前
Go语言实战案例 — 工具开发篇:实现一个图片批量压缩工具
后端·google·go
星空寻流年19 小时前
设计模式第一章(建造者模式)
java·设计模式·建造者模式
蒋星熠20 小时前
Flutter跨平台工程实践与原理透视:从渲染引擎到高质产物
开发语言·python·算法·flutter·设计模式·性能优化·硬件工程
舒一笑20 小时前
同步框架与底层消费机制解决方案梳理
后端·程序员
至此流年莫相忘1 天前
设计模式:策略模式
设计模式·策略模式
大模型教程1 天前
12天带你速通大模型基础应用(四)声音克隆技术实践
程序员·llm·agent
ytadpole1 天前
揭秘设计模式:命令模式-告别混乱,打造优雅可扩展的代码
java·设计模式
大模型教程1 天前
12天带你速通大模型基础应用(三)LLM全流程部署教程
程序员·llm·agent
AI大模型1 天前
无所不能的Embedding(05) - skip-thought的兄弟们[Trim/CNN-LSTM/quick-thought]
程序员·llm·agent
AI大模型1 天前
无所不能的Embedding(04) - skip-thought & tf-Seq2Seq源码解析
程序员·llm·agent