网站建设公司果动,小学电教检查网站建设资料,wordpress 链接跳转,广州推动优化防控措施落地文章目录 1. 概述1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概述
备忘录#xff08;Memento#xff09;用于在不破坏目标对象封装特性的基础上#xff0c;将目标对象内部的状态存储到外部对象中#xff0c;以备之后恢复状态时使用。
1.1 角色
Originato… 文章目录 1. 概述1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概述
备忘录Memento用于在不破坏目标对象封装特性的基础上将目标对象内部的状态存储到外部对象中以备之后恢复状态时使用。
1.1 角色
Originator发起者当前的基础对象它会将自己的状态保存进备忘录。 savememento()方法Originator通过该方法将它自己状态保存进一个备忘录对象。restorememento()方法Originator通过该方法将它自己状态回滚至指定备忘录。 Memento备忘录 存储Originator状态的对象Caretaker管理者保存多条备忘录的对象并维护着备忘录的索引在需要的时候会返回相应的备忘录。
1.2 类图 #mermaid-svg-O8hqzQw2a82jIgMR {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-O8hqzQw2a82jIgMR .error-icon{fill:#552222;}#mermaid-svg-O8hqzQw2a82jIgMR .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-O8hqzQw2a82jIgMR .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-O8hqzQw2a82jIgMR .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-O8hqzQw2a82jIgMR .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-O8hqzQw2a82jIgMR .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-O8hqzQw2a82jIgMR .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-O8hqzQw2a82jIgMR .marker{fill:#333333;stroke:#333333;}#mermaid-svg-O8hqzQw2a82jIgMR .marker.cross{stroke:#333333;}#mermaid-svg-O8hqzQw2a82jIgMR svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-O8hqzQw2a82jIgMR g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-O8hqzQw2a82jIgMR g.classGroup text .title{font-weight:bolder;}#mermaid-svg-O8hqzQw2a82jIgMR .nodeLabel,#mermaid-svg-O8hqzQw2a82jIgMR .edgeLabel{color:#131300;}#mermaid-svg-O8hqzQw2a82jIgMR .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-O8hqzQw2a82jIgMR .label text{fill:#131300;}#mermaid-svg-O8hqzQw2a82jIgMR .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-O8hqzQw2a82jIgMR .classTitle{font-weight:bolder;}#mermaid-svg-O8hqzQw2a82jIgMR .node rect,#mermaid-svg-O8hqzQw2a82jIgMR .node circle,#mermaid-svg-O8hqzQw2a82jIgMR .node ellipse,#mermaid-svg-O8hqzQw2a82jIgMR .node polygon,#mermaid-svg-O8hqzQw2a82jIgMR .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-O8hqzQw2a82jIgMR .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-O8hqzQw2a82jIgMR g.clickable{cursor:pointer;}#mermaid-svg-O8hqzQw2a82jIgMR g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-O8hqzQw2a82jIgMR g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-O8hqzQw2a82jIgMR .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-O8hqzQw2a82jIgMR .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-O8hqzQw2a82jIgMR .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-O8hqzQw2a82jIgMR .dashed-line{stroke-dasharray:3;}#mermaid-svg-O8hqzQw2a82jIgMR #compositionStart,#mermaid-svg-O8hqzQw2a82jIgMR .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-O8hqzQw2a82jIgMR #compositionEnd,#mermaid-svg-O8hqzQw2a82jIgMR .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-O8hqzQw2a82jIgMR #dependencyStart,#mermaid-svg-O8hqzQw2a82jIgMR .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-O8hqzQw2a82jIgMR #dependencyStart,#mermaid-svg-O8hqzQw2a82jIgMR .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-O8hqzQw2a82jIgMR #extensionStart,#mermaid-svg-O8hqzQw2a82jIgMR .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-O8hqzQw2a82jIgMR #extensionEnd,#mermaid-svg-O8hqzQw2a82jIgMR .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-O8hqzQw2a82jIgMR #aggregationStart,#mermaid-svg-O8hqzQw2a82jIgMR .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-O8hqzQw2a82jIgMR #aggregationEnd,#mermaid-svg-O8hqzQw2a82jIgMR .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-O8hqzQw2a82jIgMR .edgeTerminals{font-size:11px;}#mermaid-svg-O8hqzQw2a82jIgMR :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Originator -state:State RestoreState(m:Memento) CreateMemento() Memento -state:State GetState() Caretaker StoreMemento(m:Memento) GetMemento(c:Condition) 2. 代码示例
2.1 设计
定义备忘录memento来记录发起者状态它的Get()方法获取它的状态定义发起者Originator 它的方法 CreateMemento() 用它自己创建一条备忘录它的方法 RollBack() 将它自己回滚至指定备忘录的状态它的Set()方法可以设置它的状态它的Get()方法可以获取它的状态 创建一个管理者Caretaker它是备忘录Memento的聚合 它的AddMemento方法向它自身加入一条备忘录它的GetMemento()方法查询一条它管理的指定备忘录 调用 初始化 实例化一个管理者caretaker实例化一个发起者originator 创建备忘录测试 第一次 用发起者创建一条备忘录管理者收录该备忘录 第二次 改变发起者状态用发起者创建一条新备忘录管理者收录该备忘录 第三次 改变发起者状态用发起者创建一条新备忘录管理者收录该备忘录 查看管理者信息应该有三条备忘录 回滚测试 从管理者获取指定索引的备忘录将发起者回滚至该备忘录状态
2.2 代码
代码
package mainimport fmt// 定义备忘录
type Memento struct {state string
}// 查备忘录状态
func (m *Memento) Get() string {return m.state
}// 定义发起者
type Originator struct {state string
}// 根据发起者状态创建一条备忘录
func (e *Originator) CreateMemento() (memento *Memento) {memento Memento{state: e.state}fmt.Printf(创建一条备忘录%v\n, memento)return memento
}// 将发起者状态回滚至指定备忘录状态
func (e *Originator) RollBack(m *Memento) {e.state m.Get()fmt.Printf(发起者状态回滚至:%v\n, e)
}// 设置发起者状态
func (e *Originator) Set(state string) {e.state statefmt.Println(发起者状态更改为, e.state)
}// 获取发起者状态
func (e *Originator) Get() string {fmt.Println(获取发起者状态为, e.state)return e.state
}// 定义管理者管理者是备忘录的聚合
type Caretaker struct {mementoArray []*Memento
}// 向管理者中添加一条备忘录
func (c *Caretaker) AddMemento(m *Memento) {fmt.Printf(向管理者中添加一条备忘录%v\n, m)c.mementoArray append(c.mementoArray, m)
}// 获取指定备忘录信息
func (c *Caretaker) GetMemento(index int) *Memento {fmt.Printf(获取到第 %d 条备忘录信息为%v\n, index, c.mementoArray[index])return c.mementoArray[index]
}func main() {//实例化一个管理者caretaker : Caretaker{mementoArray: make([]*Memento, 0),}//实例化一个发起者originator : Originator{state: A,}//为发起者创建一条备忘录memento0 : originator.CreateMemento()//在管理者中加入该备忘录caretaker.AddMemento(memento0)//改变发起者状态originator.Set(B)//为发起者创建第二条备忘录memento1 : originator.CreateMemento()//在管理者中加入该备忘录caretaker.AddMemento(memento1)//再次改变发起者状态originator.Set(C)//为发起者创建第三条备忘录memento2 : originator.CreateMemento()//在管理者中加入该备忘录caretaker.AddMemento(memento2)fmt.Println(此时管理者应该有三条备忘录)for _, memento : range caretaker.mementoArray {fmt.Printf(%v\n, memento)}fmt.Println(回滚测试)originator.RollBack(caretaker.GetMemento(1))fmt.Println(回滚测试)originator.RollBack(caretaker.GetMemento(0))
}输出
创建一条备忘录{state:A}
向管理者中添加一条备忘录{state:A}
发起者状态更改为 B
创建一条备忘录{state:B}
向管理者中添加一条备忘录{state:B}
发起者状态更改为 C
创建一条备忘录{state:C}
向管理者中添加一条备忘录{state:C}
此时管理者应该有三条备忘录
{state:A}
{state:B}
{state:C}
回滚测试
获取到第 1 条备忘录信息为{state:B}
发起者状态回滚至:{B}
回滚测试
获取到第 0 条备忘录信息为{state:A}
发起者状态回滚至:{A}2.3 类图 #mermaid-svg-TspkK3aGkMDOsHno {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-TspkK3aGkMDOsHno .error-icon{fill:#552222;}#mermaid-svg-TspkK3aGkMDOsHno .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-TspkK3aGkMDOsHno .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-TspkK3aGkMDOsHno .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-TspkK3aGkMDOsHno .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-TspkK3aGkMDOsHno .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-TspkK3aGkMDOsHno .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-TspkK3aGkMDOsHno .marker{fill:#333333;stroke:#333333;}#mermaid-svg-TspkK3aGkMDOsHno .marker.cross{stroke:#333333;}#mermaid-svg-TspkK3aGkMDOsHno svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-TspkK3aGkMDOsHno g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-TspkK3aGkMDOsHno g.classGroup text .title{font-weight:bolder;}#mermaid-svg-TspkK3aGkMDOsHno .nodeLabel,#mermaid-svg-TspkK3aGkMDOsHno .edgeLabel{color:#131300;}#mermaid-svg-TspkK3aGkMDOsHno .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-TspkK3aGkMDOsHno .label text{fill:#131300;}#mermaid-svg-TspkK3aGkMDOsHno .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-TspkK3aGkMDOsHno .classTitle{font-weight:bolder;}#mermaid-svg-TspkK3aGkMDOsHno .node rect,#mermaid-svg-TspkK3aGkMDOsHno .node circle,#mermaid-svg-TspkK3aGkMDOsHno .node ellipse,#mermaid-svg-TspkK3aGkMDOsHno .node polygon,#mermaid-svg-TspkK3aGkMDOsHno .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-TspkK3aGkMDOsHno .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-TspkK3aGkMDOsHno g.clickable{cursor:pointer;}#mermaid-svg-TspkK3aGkMDOsHno g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-TspkK3aGkMDOsHno g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-TspkK3aGkMDOsHno .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-TspkK3aGkMDOsHno .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-TspkK3aGkMDOsHno .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-TspkK3aGkMDOsHno .dashed-line{stroke-dasharray:3;}#mermaid-svg-TspkK3aGkMDOsHno #compositionStart,#mermaid-svg-TspkK3aGkMDOsHno .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-TspkK3aGkMDOsHno #compositionEnd,#mermaid-svg-TspkK3aGkMDOsHno .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-TspkK3aGkMDOsHno #dependencyStart,#mermaid-svg-TspkK3aGkMDOsHno .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-TspkK3aGkMDOsHno #dependencyStart,#mermaid-svg-TspkK3aGkMDOsHno .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-TspkK3aGkMDOsHno #extensionStart,#mermaid-svg-TspkK3aGkMDOsHno .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-TspkK3aGkMDOsHno #extensionEnd,#mermaid-svg-TspkK3aGkMDOsHno .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-TspkK3aGkMDOsHno #aggregationStart,#mermaid-svg-TspkK3aGkMDOsHno .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-TspkK3aGkMDOsHno #aggregationEnd,#mermaid-svg-TspkK3aGkMDOsHno .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-TspkK3aGkMDOsHno .edgeTerminals{font-size:11px;}#mermaid-svg-TspkK3aGkMDOsHno :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Originator -string:State CreateMemento() RollBack(m *Memento) Set(state string) Get() Memento -String:State Get() Caretaker []*Memento:mementoArray AddMemento(m *Memento) GetMemento(index int) : Memento