ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

行为型:七. 备忘录模式

2022-04-23 13:34:38  阅读:152  来源: 互联网

标签:originator caretaker 模式 备忘录 state func 行为 memento


备忘录模式是什么

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

为什么要用备忘录模式

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

备忘录模式怎么实现

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. 如果客户端过于频繁地创建备忘录, 程序将消耗大量内存。

标签:originator,caretaker,模式,备忘录,state,func,行为,memento
来源: https://www.cnblogs.com/ourongxin/p/16182179.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有