Golang设计模式——10备忘录模式

备忘录模式

定义

保存一个对象的某个状态,以便在适当的时候恢复对象。

优点

  1. 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
  2. 实现了信息的封装,使得用户不需要关心状态的保存细节。

缺点

  1. 消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

场景

  1. 浏览器回退:浏览器一般有浏览记录,当我们在一个网页上点击几次链接之后,可在左上角点击左箭头回退到上一次的页面,然后也可以点击右箭头重新回到当前页面
  2. 数据库备份与还原:一般的数据库都支持备份与还原操作,备份即将当前已有的数据或者记录保留,还原即将已经保留的数据恢复到对应的表中
  3. 编辑器撤销与重做:在编辑器上编辑文字,写错时可以按快捷键 Ctrl + z 撤销,撤销后可以按 Ctrl + y 重做
  4. 虚拟机生成快照与恢复:虚拟机可以生成一个快照,当虚拟机发生错误时可以恢复到快照的样子

代码

在这里插入图片描述

package Memento

type Memento struct {
	state int
}

func NewMemento(value int) *Memento {
	return &Memento{value}
}

type Number struct {
	value int
}

func NewNumber(value int) *Number {
	return &Number{value}
}

func (n *Number) Double() {
	n.value = 2 * n.value
}
func (n *Number) Half() {
	n.value = n.value / 2
}
func (n *Number) Value() int {
	return n.value
}
func (n *Number) CreateMemento() *Memento {
	return NewMemento(n.value)
}
func (n *Number) ReinstateMemento(memento *Memento) {
	n.value = memento.state
}

package Memento

import (
	"fmt"
	"testing"
)

func TestNumber_ReinstateMemento(t *testing.T) {
	n := NewNumber(7)
	n.Double()
	n.Double()
	memento := n.CreateMemento()
	n.Half()
	n.ReinstateMemento(memento)
	fmt.Println(n.value)
}

其他设计模式

设计模式Git源代码
00简单工厂模式
01工厂方法模式
02抽象工厂模式
03外观模式
04建造者模式
05桥接模式
06命令模式
07迭代器模式
08模板模式
09访问者模式
10备忘录模式
11责任链模式
12中介模式
13原型模式
14状态模式
15策略模式
16享元模式
17组合模式
18解释器模式
19单例模式
20适配器模式
21代理模式
22装饰器模式
23观察者模式

posted @ 2021-09-25 15:06  cheems~  阅读(24)  评论(0编辑  收藏  举报