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!


    仅是学习笔记,难免出错,望不吝指点
  • 相关阅读:
    R中的一些数据形式
    R数据处理
    矩阵的一些知识
    R语言的一些矩阵运算
    R语言中的常用函数
    R读取数据和导出数据
    贝叶斯公式的理解方式
    R语言中bioconductor包
    R语言中的数据结构
    网页版的R设置环境变量
  • 原文地址:https://www.cnblogs.com/amunote/p/15416587.html
Copyright © 2011-2022 走看看