设计模式之备忘录模式

miloyang
0 评论
/ /
405 阅读
/
1958 字
22 2023-11

简介

备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不暴露对象内部状态的情况下,捕获并保存对象的内部状态,以便将对象恢复到之前的状态。

备忘录模式涉及到以下几个主要角色:

  • 发起人(Originator)

    负责创建备忘录,并记录当前时刻的内部状态;还负责使用备忘录来恢复内部状态。

  • 备忘录(Memento)

    存储发起人对象的内部状态,并提供给发起人对象恢复其状态的接口。

  • 管理者(Caretaker)

    负责保存备忘录,但不能对备忘录的内容进行操作或检查。

jugelizi

比如张三今天想去买车,但是又怕忘记了,就把买车这个形成,放到备忘录中,并且记录一个状态。

Demo

// Memento 备忘录
type Memento struct {
    State string // 状态
    Item  string // 记录事情
}

// Originator 发起人
type Originator struct {
    State string
    Item  string
}

func (o *Originator) CreateMemento() *Memento {
    return &Memento{State: o.State, Item: o.Item}
}

func (o *Originator) SetMemento(memento *Memento) {
    o.State = memento.State
    o.Item = memento.Item
}

func (o *Originator) ShowState() {
    fmt.Printf("Current State:%s , Item:%s", o.State, o.Item)
}

// Caretaker 管理者
type Caretaker struct {
    Memento *Memento
}

测试

func TestMemento(t *testing.T) {
    zhangsan := &Originator{State: "紧急", Item: "今天要去看马自达"}
    caretaker := &Caretaker{}

    caretaker.Memento = zhangsan.CreateMemento() // 把zhangsan的备忘录加到管理者中去

    fmt.Println(zhangsan)
    
    zhangsan.State = "不太紧急"
    zhangsan.Item = "今天去看宝马"

    // 不行,我还是恢复到原来的备忘吧
    zhangsan.SetMemento(caretaker.Memento)

    fmt.Println(zhangsan)
}

作用和场景

  • 保存和恢复对象状态

备忘录模式允许在不暴露对象内部结构的情况下,保存和恢复对象的状态。这对于需要回滚或撤销操作的场景非常有用。

  • 封装对象状态

    备忘录模式封装了对象状态的存储和恢复逻辑,使得对象本身无需关心这些细节。

当系统需要提供撤销(Undo)机制,允许用户回到之前的状态时,备忘录模式是一种常见的设计选择。

当需要保存和恢复对象状态,以应对系统中的意外情况或用户操作时,备忘录模式是一种有效的实现方式。

当需要保存对象状态,但不希望将其内部状态暴露给其他对象时,备忘录模式可以帮助隐藏对象的实现细节。

人未眠
工作数十年
脚步未曾歇,学习未曾停
乍回首
路程虽丰富,知识未记录
   借此博客,与之共进步