博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
备忘录——对象行为模式
阅读量:2381 次
发布时间:2019-05-10

本文共 1911 字,大约阅读时间需要 6 分钟。

意图

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态


适用性

如果系统需要提供回滚操作时,使用备忘录模式非常合适。例如文本编辑器的Ctrl+Z撤销操作的实现,数据库中事务操作。


结构图

这里写图片描述

角色

1.Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。Originator可以根据需要决定Memento存储自己的哪些内部状态。

2.Memento(备忘录):负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录。备忘录有两个接口:Caretaker只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。Originator却可看到备忘录的宽接口,允许它访问返回到先前状态所需要的所有数据。
3.Caretaker(管理者):负责备忘录Memento,不能对Memento的内容进行访问或者操作。


实现

class Originator {    private String state = "";    public String getState() {        return state;    }    public void setState(String state) {        this.state = state;    }    public Memento createMemento(){        return new Memento(this.state);    }    public void restoreMemento(Memento memento){        this.setState(memento.getState());    }}class Memento {    private String state = "";    public Memento(String state){        this.state = state;    }    public String getState() {        return state;    }    public void setState(String state) {        this.state = state;    }}class Caretaker {    private Memento memento;    public Memento getMemento(){        return memento;    }    public void setMemento(Memento memento){        this.memento = memento;    }}public class Client {    public static void main(String[] args){        Originator originator = new Originator();        originator.setState("状态1");        System.out.println("初始状态:"+originator.getState());        Caretaker caretaker = new Caretaker();        caretaker.setMemento(originator.createMemento());        originator.setState("状态2");        System.out.println("改变后状态:"+originator.getState());        originator.restoreMemento(caretaker.getMemento());        System.out.println("恢复后状态:"+originator.getState());    }}

优缺点

优点

当发起人角色中的状态改变时,有可能这是个错误的改变,我们使用备忘录模式就可以把这个错误的改变还原。

备份的状态是保存在发起人角色之外的,这样,发起人角色就不需要对各个备份的状态进行管理。

缺点

在实际应用中,备忘录模式都是多状态和多备份的,发起人角色的状态需要存储到备忘录对象中,对资源的消耗是比较严重的。


参考资料

你可能感兴趣的文章
JS读取DropDownList中的值
查看>>
进度条例子
查看>>
WordPress注册支持中文用户名的解决办法
查看>>
设置WordPress评论头像为圆角鼠标触碰后旋转效果
查看>>
WordPress:删除多说插件的版权信息
查看>>
查询表中两个条件下的数目,按三列组成表
查看>>
WinForm下禁止TextBox右键菜单
查看>>
C#_winform_DataGridView_的18种常见属性
查看>>
C# 扩展系统类string的方法
查看>>
webBrowser强制在本窗口打开,禁止在新窗口打开
查看>>
C#获取CPU序列号代码、硬盘ID、网卡硬件地址等类文件
查看>>
Html常用符号
查看>>
WinForm控制Webbrowser自动登录
查看>>
access表(.mdb文件) 导入 power designer
查看>>
PowerDesigner如何设计表之间的关联
查看>>
SQLite通用数据库类
查看>>
CMD下修改IP地址!
查看>>
安卓手机可以连上wifi但无法上网的解决办法
查看>>
C++程序员常用工具集
查看>>
在CSDN博客中添加量子恒道统计功能的做法
查看>>