行为型:七. 备忘录模式

备忘录模式是什么

备忘录模式是一种行为设计模式, 允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。

为什么要用备忘录模式

当你需要创建对象状态快照来恢复其之前的状态时,可以使用备忘录模式。或者当直接访问对象的成员变量、获取器或设置器将导致封装被突破时, 可以使用该模式。

备忘录模式怎么实现

memento.go 备忘录

备忘录用来保持对象的状态。

package memento

type memento struct {
    state string
}

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

originator.go 发起者

originator是基础对象。它会将自己的状态保持到备忘录。

package memento


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
}

caretaker.go 管理者

保存多条备忘录的对象并且维护着它们的索引,以便获取。

package memento


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

example.go 客户端调用示例

package memento

import "fmt"

func Example() {
    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())

}

优点

  1. 你可以在不破坏对象封装情况的前提下创建对象状态快照。
  2. 你可以通过让负责人维护原发器状态历史记录来简化原发器代码。

缺点

  1. 如果客户端过于频繁地创建备忘录, 程序将消耗大量内存。
posted @ 2022-04-23 13:16  EthanWell  阅读(98)  评论(0编辑  收藏  举报