备忘录(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态
UML类图:
备忘录模式包含三个角色:
//Memento 备忘录类
type Memento struct {
state string
}
//NewMemento 实例化备忘录类
func NewMemento(st string) *Memento {
return &Memento{
state: st,
}
}
//GetState 获取备忘录类的状态
func (m *Memento) GetState() string {
return m.state
}
//Originator 初始类
type Originator struct {
state string
}
//NewOriginator 实例化初始类
func NewOriginator(st string) *Originator {
return &Originator{
state: st,
}
}
//SetState 初始化类设置状态
func (o *Originator) SetState(st string) {
o.state = st
}
//GetState 从初始类中获取状态
func (o *Originator) GetState() string {
return o.state
}
//SaveStateToMemento 将初始类状态保存到备忘录类
func (o *Originator) SaveStateToMemento() *Memento {
return NewMemento(o.state)
}
//GetStateFromMemento 将备忘录类的状态读取到初始类
func (o *Originator) GetStateFromMemento(memento *Memento) {
o.state = memento.GetState()
}
//CareTaker 保存类,用于存储备忘录实例
type CareTaker struct {
MementoList map[int]*Memento
}
//NewCareTaker 实例化保存类
func NewCareTaker() *CareTaker {
return &CareTaker{
MementoList: make(map[int]*Memento),
}
}
//Add 保存类添加备忘录实例
func (ct *CareTaker) Add(index int, memento *Memento) {
ct.MementoList[index] = memento
}
//Get 保存类获取备忘录实例
func (ct *CareTaker) Get(index int) *Memento {
return ct.MementoList[index]
}
参考资料:
Go语言设计模式-备忘录
https://blog.csdn.net/weixin_40165163/article/details/91052749
设计模式
https://studygolang.com/articles/31088