其他分享
首页 > 其他分享> > GoLang设计模式11 - 备忘录模式

GoLang设计模式11 - 备忘录模式

作者:互联网

备忘录模式是一种行为型设计模式。这种模式允许我们保存对象在某些关键节点时的必要信息,以便于在适当的时候可以将之恢复到之前的状态。通常它可以用来帮助设计撤销/恢复操作。

下面是备忘录设计模式的主要角色:

Originator有两个方法: savememento() 和 restorememento()

下面是代码。

memento.go

type memento struct {
	state string
}

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

originator.go

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

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]
}

注意在caretaker中包含了一个mementoArray对象来保存全部的备忘录信息。

main.go

import "fmt"

func main() {
	caretaker := &caretaker{
		mementoArray: make([]*memento, 0),
	}
	originator := &originator{
		state: "A",
	}
	fmt.Printf("Originator Current State: %s\n", originator.getState())
	caretaker.addMemento(originator.createMemento())

	originator.setState("B")
	fmt.Printf("Originator Current State: %s\n", originator.getState())

	caretaker.addMemento(originator.createMemento())
	originator.setState("C")

	fmt.Printf("Originator Current State: %s\n", originator.getState())
	caretaker.addMemento(originator.createMemento())

	originator.restoreMemento(caretaker.getMemento(1))
	fmt.Printf("Restored to State: %s\n", originator.getState())

	originator.restoreMemento(caretaker.getMemento(0))
	fmt.Printf("Restored to State: %s\n", originator.getState())
}

执行结果为:

Originator Current State: A
Originator Current State: B
Originator Current State: C
Restored to State: B
Restored to State: A

代码已上传至GitHub: zhyea / go-patterns / memento-pattern 。

END!

标签:11,Originator,caretaker,State,GoLang,state,originator,设计模式,memento
来源: https://www.cnblogs.com/amunote/p/15416587.html