Go 设计模式中备忘录模式

鱼弦:CSDN内容合伙人、CSDN新星导师、全栈领域创作新星创作者 、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() 方法来保存和恢复备忘录对象。

使用场景解释:
备忘录模式适用于以下场景:

  1. 当需要保存对象的状态,并且希望在之后的某个时间点恢复到先前的状态时,可以使用备忘录模式。备忘录模式可以捕获对象的内部状态并存储到备忘录对象中,然后可以根据需要恢复到之前的状态。

  2. 当需要实现对象的撤销和重做操作时,可以考虑使用备忘录模式。备忘录模式可以保存对象的多个状态,并且可以根据需要回滚到先前的状态或者重新应用之前的状态。

  3. 当对象的状态保存和恢复过程需要对外部隐藏时,可以使用备忘录模式。备忘录模式通过封装对象的状态到备忘录对象中,可以保护对象的封装性,使得外部无法直接访问和修改对象的状态。

代码示例实现:
以下是一个使用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 表示管理者,负责保存备忘录对象,并提供保存和恢复备忘录的方法。

文献材料链接:
以下是备忘录模式的一些参考文献链接:

  1. Design Patterns: Elements of Reusable Object-Oriented Software

    • 作者:Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
    • 链接:Amazon.com
  2. Memento Pattern - Tutorialspoint

  3. Memento Design Pattern - GeeksforGeeks

当前都有哪些产品在使用:
备忘录模式是一种常见的设计模式,在软件开发中有许多产品和框架使用了该模式。以下是一些使用备忘录模式的产品和框架的示例:

  1. 文字处理软件:许多文字处理软件(如Microsoft Word)使用备忘录模式来实现撤销和重做功能,允许用户在编辑过程中保存状态并恢复到之前的状态。

  2. 图形编辑器:图形编辑器(如Adobe Photoshop)通常使用备忘录模式来保存和恢复图形对象的状态,以便用户可以撤销和重做操作。

  3. 版本控制系统:一些版本控制系统(如Git)使用备忘录模式来保存代码库的不同版本,以便用户可以切换和恢复先前的代码状态。

猜你喜欢

转载自blog.csdn.net/feng1790291543/article/details/132160756