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!


    仅是学习笔记,难免出错,望不吝指点
  • 相关阅读:
    Java中BigDecimal的8种舍入模式
    Spring 4.3.2下实现http多次断点下载
    java文件同步性能测试
    JavaMail发送邮件时判断发送结果1.5.x
    关于mysql备份说明
    jxl 2.6.12 与 jxl 2.3.0 稳定版性能比较
    select选择框内容左右移动添加删除栏(升级)
    JS 清除字符串数组中,重复元素
    Js 数据容量单位转换(kb,mb,gb,tb)
    fine-uploader 5.11.8 (最新版) 使用感受
  • 原文地址:https://www.cnblogs.com/amunote/p/15416587.html
Copyright © 2011-2022 走看看