春のセール
Memento

Memento を Go で

Memento 振る舞いに関するデザインパターンの一つで オブジェクトの状態のスナップショットを作成し それを将来復元します

Memento は その対象オブジェクトの内部構造やスナップショットの内部に保存されるデータの機密を守ります

概念的な例

Memento パターンでは オブジェクトの状態のスナップショットを保存できます スナップショットを使って オブジェクトを以前の状態に戻すことができます オブジェクトの操作取り消しや やり直しを実装する際に便利です

originator.go: オリジネーター

package main

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
}

memento.go: メメント

package main

type Memento struct {
	state string
}

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

caretaker.go: ケアテーカー

package main

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

main.go: クライアント・コード

package main

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())

}

output.txt: 実行結果

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

他言語での Memento

Memento を C# で Memento を C++ で Memento を Java で Memento を PHP で Memento を Python で Memento を Ruby で Memento を Rust で Memento を Swift で Memento を TypeScript で