设计模式--备忘录(Memento)模式

模式定义

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态

类图

在这里插入图片描述

要点总结

  • 备忘录(Memento)存储原发器(Originator)对象的内部状态,在需要时恢复原发器状态
  • Memento模式的核心是信息隐藏,即Originator需要向外界隐藏信息,保持其封装性,但同时又需要将状态保持到外界(Memento)

Go语言代码实现

备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不破坏封装性的情况下捕获和存储对象的内部状态,并在需要时将对象恢复到之前的状态。

备忘录模式的核心思想是将对象的状态封装成备忘录对象,并将备忘录对象存储起来。原始对象可以通过备忘录对象恢复到之前的状态,而无需直接访问和修改对象的内部状态。

以下是一个简单的例子来说明备忘录模式的应用:

package main

import "fmt"

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

// Originator 原始对象
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
}

// Caretaker 负责管理备忘录对象
type Caretaker struct {
	memento *Memento
}

func (c *Caretaker) SetMemento(memento *Memento) {
	c.memento = memento
}

func (c *Caretaker) GetMemento() *Memento {
	return c.memento
}

func main() {
	originator := &Originator{}

	// 设置初始状态
	originator.SetState("State 1")
	fmt.Println("Current State:", originator.GetState())

	// 创建备忘录并保存状态
	caretaker := &Caretaker{}
	caretaker.SetMemento(originator.CreateMemento())

	// 修改状态
	originator.SetState("State 2")
	fmt.Println("Current State:", originator.GetState())

	// 恢复到之前的状态
	originator.RestoreMemento(caretaker.GetMemento())
	fmt.Println("Current State:", originator.GetState())
}

在上述示例中,我们定义了备忘录对象Memento、原始对象Originator和负责管理备忘录对象的Caretaker。

原始对象包含一个状态属性,可以通过SetState和GetState方法进行设置和获取。原始对象可以创建备忘录对象,并通过备忘录对象保存当前的状态;也可以通过备忘录对象恢复到之前保存的状态。

负责管理备忘录对象的Caretaker对象可以设置和获取备忘录对象。

在main函数中,我们创建了原始对象originator并设置初始状态。然后,我们创建了一个Caretaker对象,通过原始对象创建备忘录对象,并保存了当前的状态。

接下来,我们修改了原始对象的状态,然后通过备忘录对象恢复到之前保存的状态。

通过备忘录模式,我们可以在不破坏封装性的情况下,捕获和存储对象的内部状态,并在需要时将对象恢复到之前的状态。备忘录模式对于需要实现撤销、恢复或历史记录等功能的场景非常有用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值