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
相关推荐
嵌入式小企鹅14 小时前
算力价值重估、AI编程模型齐开源、RISC-V融资15亿
人工智能·学习·ai·程序员·risc-v·前沿科技·太空算力
geovindu15 小时前
go:Decorator Pattern
开发语言·设计模式·golang·装饰器模式
ximu_polaris15 小时前
设计模式(C++)-行为型模式-观察者模式
c++·观察者模式·设计模式
审判长烧鸡1 天前
Go命名规则【2】全场景命名避坑指南
go·命名规则·ai问答
小兵张健1 天前
一场大概率没拿到 offer 的面试,让我更坚定去做喜欢的事
人工智能·面试·程序员
众少成多积小致巨1 天前
Soong构建入门
android·go·编译器
ServBay1 天前
2026年 Go 开发中没有它就不行的 10 个库
后端·go
阿虎儿1 天前
56条软件工程开发定律
程序员
Lands1 天前
推荐一下配合agent开发的工具
设计模式·agent
程序员鱼皮1 天前
Git WorkTree 是什么?凭什么能让 AI 编程效率翻倍?
git·ai·程序员·编程·ai编程