go实现备忘录模式

备忘录模式让我们可以保存对象状态的快照。 你可使用这些快照来将对象恢复到之前的状态。 这在需要在对象上实现撤销-重做操作时非常实用。

目录结构

├── caretaker.go
├── memento.go
├── memento_test.go
└── originator.go

memento.go / 备忘录

package memento

type Memento struct {
	state string
}

func (m *Memento) getSavedState() string {
	return m.state
}

originator.go / 原发器

package memento
// 原发器

type Originator struct {
	state string
}

func (e *Originator) CreateMemento() *Memento {
	return &Memento{state: e.state}
}

func (e *Originator) RestoreMemento(m *Memento) {
	e.state = m.getSavedState()
}

func (e *Originator) SetState(state string) {
	e.state = state
}

func (e *Originator) GetState() string {
    return e.state
}

caretaker.go / 负责人

package memento

type Caretaker struct {
    mementoArray []*Memento
}

func (c *Caretaker) AddMemento(m *Memento) {
    c.mementoArray = append(c.mementoArray, m)
}

func (c *Caretaker) GetMemento(index int) *Memento {
    return c.mementoArray[index]
}

memento_test.go / 测试

package memento

import (
	"fmt"
	"testing"
)

func TestMemento(t *testing.T) {
	caretaker := &Caretaker{
		mementoArray: make([]*Memento, 0),
	}

	originator := &Originator{
		state: "State 1",
	}

	fmt.Printf("Originator: %v\n", originator.state)
	caretaker.AddMemento(originator.CreateMemento())

	originator.state = "State 2"
	fmt.Printf("Originator: %v\n", originator.state)
	caretaker.AddMemento(originator.CreateMemento())

	originator.state = "State 3"
	fmt.Printf("Originator: %v\n", originator.state)
	caretaker.AddMemento(originator.CreateMemento())

	originator.RestoreMemento(caretaker.GetMemento(1))
	fmt.Printf("Restore to: %v\n", originator.state)

	originator.RestoreMemento(caretaker.GetMemento(0))
	fmt.Printf("Restore to: %v\n", originator.state)
}

输出结果

=== RUN   TestMemento
Originator: State 1
Originator: State 2
Originator: State 3
Restore to: State 2
Restore to: State 1
--- PASS: TestMemento (0.00s)
posted @ 2024-06-19 10:37  Jikefan  阅读(12)  评论(0)    收藏  举报