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!


    仅是学习笔记,难免出错,望不吝指点
  • 相关阅读:
    博客园
    未释放的已删除文件
    ssh连接缓慢
    剑指 Offer 38. 字符串的排列
    剑指 Offer 37. 序列化二叉树
    剑指 Offer 50. 第一个只出现一次的字符
    剑指 Offer 36. 二叉搜索树与双向链表
    剑指 Offer 35. 复杂链表的复制
    剑指 Offer 34. 二叉树中和为某一值的路径
    剑指 Offer 33. 二叉搜索树的后序遍历序列
  • 原文地址:https://www.cnblogs.com/amunote/p/15416587.html
Copyright © 2011-2022 走看看