鱼弦:内容合伙人、新星导师、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen)
备忘录模式原理详细解释:
备忘录模式(Memento Pattern)是一种行为型设计模式,用于在不破坏封装性的前提下,捕获和恢复对象的内部状态。
备忘录模式的核心思想是将对象的状态保存到一个备忘录对象中,然后可以根据需要恢复到之前的状态。这样可以在不暴露对象内部结构的情况下,实现对象的状态保存和恢复,并且可以提供撤销和重做操作。
备忘录模式通常包含以下几个角色:
- 发起人(Originator):定义需要保存和恢复状态的对象,并且可以创建备忘录对象和从备忘录对象中恢复状态。
- 备忘录(Memento):用于存储发起人对象的内部状态。
- 管理者(Caretaker):负责保存备忘录对象,并且可以根据需要将备忘录对象恢复到发起人的状态。
底层结构图:
以下是备忘录模式的经典结构图:
+------------------+ +------------------+ +------------------+
| Originator | | Memento | | Caretaker |
+------------------+ +------------------+ +------------------+
| +GetState() | | +GetState() | | +SaveMemento() |
| +SetState() |<-------->| +SetState() | | +RestoreMemento() |
| +CreateMemento() | | | | |
| +RestoreMemento() | | | | |
+------------------+ +------------------+ +------------------+
在上述结构图中,Originator
是发起人的角色,负责定义需要保存和恢复状态的对象。它可以通过 GetState()
和 SetState()
方法获取和设置对象的状态,通过 CreateMemento()
方法创建备忘录对象,以及通过 RestoreMemento()
方法从备忘录对象中恢复状态。
Memento
是备忘录的角色,用于存储发起人对象的内部状态。它提供了 GetState()
和 SetState()
方法来获取和设置状态的值。
Caretaker
是管理者的角色,负责保存备忘录对象,并且可以根据需要将备忘录对象恢复到发起人的状态。它提供了 SaveMemento()
和 RestoreMemento()
方法来保存和恢复备忘录对象。
使用场景解释:
备忘录模式适用于以下场景:
- 当需要保存对象的状态,并且希望在之后的某个时间点恢复到先前的状态时,可以使用备忘录模式。备忘录模式可以捕获对象的内部状态并存储到备忘录对象中,然后可以根据需要恢复到之前的状态。
- 当需要实现对象的撤销和重做操作时,可以考虑使用备忘录模式。备忘录模式可以保存对象的多个状态,并且可以根据需要回滚到先前的状态或者重新应用之前的状态。
- 当对象的状态保存和恢复过程需要对外部隐藏时,可以使用备忘录模式。备忘录模式通过封装对象的状态到备忘录对象中,可以保护对象的封装性,使得外部无法直接访问和修改对象的状态。
代码示例实现:
以下是一个使用Go语言实现备忘录模式的示例:
package main
import "fmt"
// Memento 备忘录
type Memento struct {
state string
}
// Originator 发起人
type Originator struct {
state string
}
func (o *Originator) GetState() string {
return o.state
}
func (o *Originator) SetState(state string) {
o.state = state
}
func (o *Originator) CreateMemento() *Memento {
return &Memento{state: o.state}
}
func (o *Originator) RestoreMemento(m *Memento) {
o.state = m.state
}
// Caretaker 管理者
type Caretaker struct {
memento *Memento
}
func (c *Caretaker) SaveMemento(m *Memento) {
c.memento = m
}
func (c *Caretaker) RestoreMemento() *Memento {
return c.memento
}
func main() {
originator := &Originator{}
caretaker := &Caretaker{}
originator.SetState("State 1")
fmt.Println("Current State:", originator.GetState()) // Output: Current State: State 1
// 保存状态
caretaker.SaveMemento(originator.CreateMemento())
originator.SetState("State 2")
fmt.Println("Current State:", originator.GetState()) // Output: Current State: State 2
// 恢复状态
originator.RestoreMemento(caretaker.RestoreMemento())
fmt.Println("Current State:", originator.GetState()) // Output: Current State: State 1
}
在上述示例中,Originator
表示发起人,存储对象的状态并提供获取和设置状态的方法。CreateMemento()
方法用于创建备忘录对象,RestoreMemento()
方法用于从备忘录对象中恢复状态。
Memento
表示备忘录,用于存储发起人对象的状态。
Caretaker
表示管理者,负责保存备忘录对象,并提供保存和恢复备忘录的方法。
文献材料链接:
以下是备忘录模式的一些参考文献链接:
- Design Patterns: Elements of Reusable Object-Oriented Software
- 作者:Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
- Memento Pattern - Tutorialspoint
- Memento Design Pattern - GeeksforGeeks
当前都有哪些产品在使用:
备忘录模式是一种常见的设计模式,在软件开发中有许多产品和框架使用了该模式。以下是一些使用备忘录模式的产品和框架的示例:
- 文字处理软件:许多文字处理软件(如Microsoft Word)使用备忘录模式来实现撤销和重做功能,允许用户在编辑过程中保存状态并恢复到之前的状态。
- 图形编辑器:图形编辑器(如Adobe Photoshop)通常使用备忘录模式来保存和恢复图形对象的状态,以便用户可以撤销和重做操作。
- 版本控制系统:一些版本控制系统(如Git)使用备忘录模式来保存代码库的不同版本,以便用户可以切换和恢复先前的代码状态。