GoLang設計模式11 - 備忘錄模式

robin·張發表於2021-10-17

備忘錄模式是一種行為型設計模式。這種模式允許我們儲存物件在某些關鍵節點時的必要資訊,以便於在適當的時候可以將之恢復到之前的狀態。通常它可以用來幫助設計撤銷/恢復操作。

下面是備忘錄設計模式的主要角色:

  • Originator(發起者):Originator是當前的基礎物件,它會將自己的狀態儲存進備忘錄
  • Memento(備忘錄) : 儲存著Originator的狀態的物件
  • Caretaker(管理人):Caretaker是儲存著多條備忘錄的物件,並維護著備忘錄的索引,在需要的時候會返回相應的備忘錄

Originator有兩個方法: savememento() 和 restorememento()

  • savememento(): Originator通過這個方法將其狀態儲存進一個備忘錄物件
  • restorememento(): 這個方法將備忘錄物件作為輸入資訊。Originator會通過傳進來的備忘錄資訊執行重建。

下面是程式碼。

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!

相關文章