行为型 备忘者模式

为什么需要备忘者模式

备忘者模式是为了保存程序内部状态,但是又不能暴露内在状态,只可用于恢复状态使用。一般上实现是通过实现一个接口更窄的类来完成设计,新的接口只具有备份和恢复功能。

实现

实现起来就是被保存的对象可以创建snapshot,但是这个snapshot功能有限只能实现获取状态的功能。

go.mod

module memento

go 1.13

memento.go

package memento

import (
	"fmt"
)

type GameState interface {
	SetState(s string)
	GetState() string
	GetSnapshot() Snapshot
	RestoreFromSnapshot(snapshot Snapshot)
}

type Snapshot interface {
	GetState() string
	PersistToDisk()
}

type SuperMario struct {
	state string
}

func (mario *SuperMario) SetState(s string) {
	mario.state = s
}

func (mario *SuperMario) GetState() string {
	return mario.state
}

func (mario *SuperMario) GetSnapshot() Snapshot {
	return &GameSnapshot{
		m: mario.state,
	}
}

func (mario *SuperMario) RestoreFromSnapshot(snapshot Snapshot) {
	mario.state = snapshot.GetState()
}

type GameSnapshot struct {
	m string
}

func (g *GameSnapshot) GetState() string {
	return g.m
}

func (g *GameSnapshot) PersistToDisk() {
	fmt.Println("Saving to disk...")
}

memento_test.go

package memento_test

import (
	"memento"
	"testing"
)

func TestMemento(t *testing.T) {
	mario := &memento.SuperMario{}
	mario.SetState("Init")
	snapshot := mario.GetSnapshot()
	mario.SetState("Fail")
	if mario.GetState() != "Fail" {
		t.Fatal("Incorrect set state")
	}

	mario.RestoreFromSnapshot(snapshot)
	if mario.GetState() != "Init" {
		t.Fatal("Incorrect restore to init state")
	}
}

执行: go test memento -v

Previous
Next