20

19.Golang设计模式之备忘录模式

 3 years ago
source link: https://studygolang.com/articles/31088
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

备忘录模式

GitHub代码链接 备忘录模式(Memento Pattern)保存对象的某一个状态,以便在适时的时候回复对象。

什么是备忘录模式

备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并且在对象之外保存这个状态,这样可以在以后将这个对象恢复的原先保存的状态。

解决了什么问题

很多时候,我们需要记录一个对象的内部状态,这样允许用户取消不确定或者错误的操作。可以在以后恢复到保存前的状态。

优点

  • 打游戏时可以存档
  • Windows的ctrl + z
  • 数据库的事物管理

缺点

  • 消耗资源,每次保存消耗一定的内存

代码实现

1.1 实现备忘录类

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

1.2 实现原始数据记录类

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

1.3 实现数据存档类

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

上一篇

18.Golang设计模式之中介者模式

下一篇

有疑问加站长微信联系

iiUfA3j.png!mobile

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK