备忘录模式原理:

备忘录模式是一种行为型设计模式,它允许你捕获一个对象的内部状态并在需要时恢复它。备忘录模式通过将对象状态保存到备忘录对象中,然后在需要时从备忘录对象中恢复状态,实现了对象状态的保存与恢复。

备忘录模式涉及以下几个角色:
- 发起人(Originator):负责创建一个备忘录对象,用于保存当前状态,并可以通过备忘录对象恢复到之前的状态。
- 备忘录(Memento):用于存储发起人的内部状态。
- 管理者(Caretaker):负责保存备忘录对象,但不能访问备忘录的具体内容。
 
备忘录模式的工作原理如下:
1. 发起人创建一个备忘录对象,并将自身的状态保存到备忘录对象中。
2. 管理者保存备忘录对象。
3. 当需要恢复到之前的状态时,管理者从保存的备忘录对象中获取状态,并将状态恢复给发起人。
 
备忘录模式的优点包括:
- 提供了一种可以回滚对象状态的机制,让对象可以恢复到之前的状态。
- 发起人与备忘录对象之间的状态相互独立,可以随意保存和恢复状态。
 
备忘录模式的缺点包括:
- 如果发起人的状态需要频繁保存和恢复,会消耗大量的内存。
- 发起人与备忘录对象之间的耦合性增加,需要在发起人中维护备忘录对象。
 
备忘录模式在实际开发中的应用场景包括:
- 撤销操作:可以使用备忘录模式保存对象的状态,以便在需要时撤销操作。
- 数据库事务回滚:可以使用备忘录模式将数据库事务的状态保存到备忘录对象中,以便在需要回滚时恢复事务状态。
 
总之,备忘录模式通过保存和恢复对象的状态,提供了一种灵活的机制来回滚对象状态或恢复到之前的状态。
 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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package main

import "fmt"

// 备忘录
type Memento struct {
	state string
}

// 发起人
type Originator struct {
	state string
}

func (o *Originator) SetState(state string) {
	o.state = state
}
func (o *Originator) GetState() string {
	return o.state
}
func (o *Originator) CreateMemento() *Memento {
	return &Memento{state: o.state}
}
func (o *Originator) RestoreMemento(memento *Memento) {
	o.state = memento.state
}

// 管理者
type Caretaker struct {
	memento *Memento
}

func (c *Caretaker) SaveMemento(memento *Memento) {
	c.memento = memento
}
func (c *Caretaker) GetMemento() *Memento {
	return c.memento
}
func main() {
	originator := &Originator{}
	caretaker := &Caretaker{}
	originator.SetState("State 1")
	fmt.Println("Current State:", originator.GetState())
	// 保存状态
	caretaker.SaveMemento(originator.CreateMemento())
	originator.SetState("State 2")
	fmt.Println("Current State:", originator.GetState())
	// 恢复状态
	originator.RestoreMemento(caretaker.GetMemento())
	fmt.Println("Restored State:", originator.GetState())
}

在上面的例子中,我们定义了一个发起人(Originator)和一个管理者(Caretaker)。发起人负责创建备忘录(Memento)对象并保存状态,而管理者负责保存和获取备忘录对象。

在主函数中,我们首先创建了一个发起人和一个管理者。然后,我们设置发起人的状态为 “State 1”,并打印当前状态。接下来,我们保存了发起人的状态到备忘录对象中。

然后,我们将发起人的状态设置为 “State 2”,并再次打印当前状态。最后,我们从管理者获取备忘录对象,并将发起人的状态恢复到之前保存的状态。最终,我们打印恢复后的状态。

这个例子展示了如何使用备忘录模式来保存和恢复对象的状态。