备忘录模式

备忘录模式的概念

备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。

备忘录模式通过创建一个包含对象状态的快照来实现这一点,以便在需要时可以恢复到这个状态。

备忘录模式的作用

状态恢复:允许对象恢复到之前的状态。
撤销操作:支持撤销操作,例如在文本编辑器中撤销上一步操作。
状态管理:在不破坏封装性的前提下,管理对象的状态。

备忘录模式的应用场景

需要保存和恢复对象状态的场景。

需要提供撤销功能的场景。

在对象状态变化频繁且需要记录历史状态的场景。

使用 Go 语言实现备忘录模式的示例

下面是一个简单的 Go 语言示例,演示如何使用备忘录模式来保存和恢复对象的状态。

package main

import (
	"fmt"
)

// Originator 原发器,负责创建一个备忘录并存储它的当前状态
type Originator struct {
	State string
}

// Memento 备忘录,存储原发器的状态
type Memento struct {
	State string
}

// CreateMemento 创建一个备忘录,存储当前状态
func (o *Originator) CreateMemento() *Memento {
	return &Memento{State: o.State}
}

// RestoreMemento 从备忘录中恢复状态
func (o *Originator) RestoreMemento(m *Memento) {
	o.State = m.State
}

// Caretaker 管理者,负责保存和恢复备忘录
type Caretaker struct {
	Mementos []*Memento
}

// AddMemento 添加一个备忘录
func (c *Caretaker) AddMemento(m *Memento) {
	c.Mementos = append(c.Mementos, m)
}

// GetMemento 获取指定索引的备忘录
func (c *Caretaker) GetMemento(index int) *Memento {
	if index < 0 || index >= len(c.Mementos) {
		return nil
	}
	return c.Mementos[index]
}

func main() {
	// 创建原发器
	originator := &Originator{State: "State1"}
	fmt.Println("Initial State:", originator.State)

	// 创建管理者
	caretaker := &Caretaker{}

	// 创建备忘录并保存
	memento1 := originator.CreateMemento()
	caretaker.AddMemento(memento1)
	fmt.Println("State saved as Memento1")

	// 改变原发器状态
	originator.State = "State2"
	fmt.Println("Changed State:", originator.State)

	// 创建备忘录并保存
	memento2 := originator.CreateMemento()
	caretaker.AddMemento(memento2)
	fmt.Println("State saved as Memento2")

	// 改变原发器状态
	originator.State = "State3"
	fmt.Println("Changed State:", originator.State)

	// 从备忘录恢复状态
	originator.RestoreMemento(caretaker.GetMemento(1))
	fmt.Println("Restored to State2:", originator.State)

	// 从备忘录恢复状态
	originator.RestoreMemento(caretaker.GetMemento(0))
	fmt.Println("Restored to State1:", originator.State)
}