设计模式之备忘录模式
2016-05-09 10:42
375 查看
总体来说设计模式分为三大类:
创建型模式5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式7种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
[b]通过两个对象实现:Originator以及Caretaker。[/b]
Originator类代表了其状态能够被存储并被用于恢复之前的状态,它使用内部类保存对象的状态。此内部类就被叫做备忘录。此类是私有的,不能被其他对象访问。
Caretaker是一个帮助类,它的职责就是通过备忘录帮助Originator存储当前状态或者恢复重建其之前的状态。
备忘录是Originator的私有类,Caretaker不能访问它,因此它作为一个对象被存储在caretaker中
Demo:文本编辑器案例
记得吃早餐~出门记得带钥匙~
记得吃早餐~
②Originator对象有一些属性不是不可变的,我们需要使用深拷贝或者克隆来避免数据的完整性问题。使用序列化来取得备忘录模式的实现不失为一般方法,而不是为每一个对象创建一个自己的备忘录实现。
③如果Originator对象非常巨大,那么备忘录对象的大小也会被相应增大,因而需要更多的内存空间。
创建型模式5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式7种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
备忘录模式
即“备份-恢复”。[b]通过两个对象实现:Originator以及Caretaker。[/b]
Originator类代表了其状态能够被存储并被用于恢复之前的状态,它使用内部类保存对象的状态。此内部类就被叫做备忘录。此类是私有的,不能被其他对象访问。
Caretaker是一个帮助类,它的职责就是通过备忘录帮助Originator存储当前状态或者恢复重建其之前的状态。
备忘录是Originator的私有类,Caretaker不能访问它,因此它作为一个对象被存储在caretaker中
Demo:文本编辑器案例
首先,创建Originator类
public class FileWriterUtil { private String fileName; private StringBuilder content; public FileWriterUtil(String file){ fileName=file; content=new StringBuilder(); } @Override public String toString(){ return content.toString(); } public void write(String str){ content.append(str); } public Memento save(){ return new Memento(fileName,content); } public void undoToLastSave(Object obj){ Memento memento = (Memento) obj; fileName= memento.fileName; content=memento.content; } private class Memento{ private String fileName; private StringBuilder content; public Memento(String file, StringBuilder content){ this.fileName=file; this.content=new StringBuilder(content);//深拷贝,防止内容指向同一地址 } } }
其次,创建Caretaker类
public class FileWriterCaretaker { private Object obj; public void save(FileWriterUtil fileWriter){ this.obj=fileWriter.save(); } public void undo(FileWriterUtil fileWriter){ fileWriter.undoToLastSave(obj); } }
然后,创建测试类
public class FileWriterClient { public static void main(String[] args) { FileWriterCaretaker caretaker = new FileWriterCaretaker(); FileWriterUtil fileWriter = new FileWriterUtil("info.txt"); fileWriter.write("记得吃早餐~"); System.out.println(fileWriter); caretaker.save(fileWriter); fileWriter.write("出门记得带钥匙~"); System.out.println(fileWriter); caretaker.undo(fileWriter); System.out.println(fileWriter); } }
最后,查看输出结果
记得吃早餐~记得吃早餐~出门记得带钥匙~
记得吃早餐~
注意啦
①备忘录类只能被Originator对象访问。在客户端程序中,使用caretaker对象完成保存或恢复originator对象的状态。②Originator对象有一些属性不是不可变的,我们需要使用深拷贝或者克隆来避免数据的完整性问题。使用序列化来取得备忘录模式的实现不失为一般方法,而不是为每一个对象创建一个自己的备忘录实现。
③如果Originator对象非常巨大,那么备忘录对象的大小也会被相应增大,因而需要更多的内存空间。
相关文章推荐
- Mysql:Forcing close of thread 756 user: 'root' 的解决
- PHP 中的文件处理技术
- iOS开发技巧(使用Xcode DEBUG模式和RELEASE模式)
- 多级指标打分表单自动创建JavaScript代码解析
- 设计模式之建造者模式用例
- 函数定义中为什么可返回函数内部定义的函数?
- 经验:人工智能威力初显,想养一只阿尔法狗帮我画图
- Unity3d本地上传并且裁剪图片-----Android平台
- android studio 1.5升级到2.0或2.1报错
- java 请求响应soap(webService)
- exel 单元格数值变化,及时改变另一列显示背景颜色
- 团队冲刺第十一天
- 团队冲刺第十天
- explicit构造函数的作用
- 多Web服务器之间共享Session的解决方案
- windows下使用批处理脚本实现多个版本的JDK切换
- php简单复制文件的方法
- eclipse使用技巧----TODO-----给你的代码加上书签
- JavaScript -- 音频视频的播放
- 【转载】IIS配置错误信息输出