Skip to content

Latest commit

 

History

History

Memento

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

Memento 備忘錄模式:

在不違反封裝性的前提下, 捕捉物件的內部狀態並存在外面,以便日後回復至此一狀態

在不破壞封裝性的前提下, 捕獲一個物件的內容狀態, 並在該物件之外保存這個狀態. 這樣以後就可以將該物件恢復到原先保存的狀態

UML

Example

https://github.com/kimi0230/DesignPatternGolang/tree/master/Memento

package memento

import "fmt"

// GameRole: 遊戲角色, 發起人  Originator
type GameRole struct {
	Vit int
	Atk int
	Def int
}

func (g *GameRole) InitState() {
	if g == nil {
		return
	}
	g.Vit = 100
	g.Atk = 100
	g.Def = 100
}

func (g *GameRole) Fight() {
	if g == nil {
		return
	}
	g.Vit = 0
	g.Atk = 0
	g.Def = 0
}

func (g *GameRole) StateDisplay() {
	if g == nil {
		return
	}
	fmt.Println("當前狀態:")
	fmt.Println("生命力 : ", g.Vit)
	fmt.Println("攻擊力 :", g.Atk)
	fmt.Println("防禦力 :", g.Def)
}

// 保存角色狀態
func (g *GameRole) SaveState() RoleStateMemento {
	if g == nil {
		return RoleStateMemento{}
	}
	return RoleStateMemento{g.Vit, g.Atk, g.Def}
}
func (g *GameRole) RecoveryState(memento RoleStateMemento) {
	if g == nil {
		return
	}
	g.Vit = memento.Vitality()
	g.Atk = memento.Attack()
	g.Def = memento.Defense()
}

// RoleStateMemento : 角色狀態儲存箱, 備忘錄 Memento
type RoleStateMemento struct {
	vit int
	atk int
	def int
}

func (r *RoleStateMemento) Vitality() int {
	if r == nil {
		return 0
	}
	return r.vit
}

func (r *RoleStateMemento) Attack() int {
	if r == nil {
		return 0
	}
	return r.atk
}

func (r *RoleStateMemento) Defense() int {
	if r == nil {
		return 0
	}
	return r.def
}

// 角色狀態管理員 Caretaker
type RoleStateCaretaker struct {
	memento RoleStateMemento
}

func (rc *RoleStateCaretaker) Memento() RoleStateMemento {
	if rc == nil {
		return RoleStateMemento{}
	}
	return rc.memento
}

func (rc *RoleStateCaretaker) SetMemento(m RoleStateMemento) {
	if rc == nil {
		return
	}
	rc.memento = m
}