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