zoukankan      html  css  js  c++  java
  • GoLang设计模式11

    备忘录模式是一种行为型设计模式。这种模式允许我们保存对象在某些关键节点时的必要信息,以便于在适当的时候可以将之恢复到之前的状态。通常它可以用来帮助设计撤销/恢复操作。

    下面是备忘录设计模式的主要角色:

    • Originator(发起者):Originator是当前的基础对象,它会将自己的状态保存进备忘录
    • Memento(备忘录) : 存储着Originator的状态的对象
    • Caretaker(管理人):Caretaker是保存着多条备忘录的对象,并维护着备忘录的索引,在需要的时候会返回相应的备忘录

    Originator有两个方法: savememento() 和 restorememento()

    • savememento(): Originator通过这个方法将其状态保存进一个备忘录对象
    • restorememento(): 这个方法将备忘录对象作为输入信息。Originator会通过传进来的备忘录信息执行重建。

    下面是代码。

    memento.go

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

    originator.go

    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

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

    注意在caretaker中包含了一个mementoArray对象来保存全部的备忘录信息。

    main.go

    import "fmt"
    
    func main() {
    	caretaker := &caretaker{
    		mementoArray: make([]*memento, 0),
    	}
    	originator := &originator{
    		state: "A",
    	}
    	fmt.Printf("Originator Current State: %s
    ", originator.getState())
    	caretaker.addMemento(originator.createMemento())
    
    	originator.setState("B")
    	fmt.Printf("Originator Current State: %s
    ", originator.getState())
    
    	caretaker.addMemento(originator.createMemento())
    	originator.setState("C")
    
    	fmt.Printf("Originator Current State: %s
    ", originator.getState())
    	caretaker.addMemento(originator.createMemento())
    
    	originator.restoreMemento(caretaker.getMemento(1))
    	fmt.Printf("Restored to State: %s
    ", originator.getState())
    
    	originator.restoreMemento(caretaker.getMemento(0))
    	fmt.Printf("Restored to State: %s
    ", originator.getState())
    }
    

    执行结果为:

    Originator Current State: A
    Originator Current State: B
    Originator Current State: C
    Restored to State: B
    Restored to State: A
    

    代码已上传至GitHub: zhyea / go-patterns / memento-pattern 。

    END!


    仅是学习笔记,难免出错,望不吝指点
  • 相关阅读:
    FLV视频转换的利器 ffmpeg.exe
    ffmpeg参数设定解说
    SQL里加减日期
    SQL Server 获得影响行数
    CheckBoxList RadioButtonList 不生成table 表示
    SQL语句 从一个表读取数据,写入到另一个表的相同字段中
    ffmpeg和Mencoder使用实例小全
    执行存储过程出现:"不是有效的标识符。"
    SQL 格式化超长的字段
    js遍历选中的dom元素
  • 原文地址:https://www.cnblogs.com/amunote/p/15416587.html
Copyright © 2011-2022 走看看