被说了很多遍的设计模式---备忘录模式
来源:互联网 发布:fl studio12破解版mac 编辑:程序博客网 时间:2024/05/01 21:17
[把你的理性思维慢慢变成条件反射]
好久不见,新年第一更,本文,我们讲介绍备忘录模式,文章主题结构与上文一致。惯例,先来看看我们示例工程的环境:
操作系统:win7 x64
其他软件:eclipse mars,jdk7
-------------------------------------------------------------------------------------------------------------------------------------
经典问题:
系统临时状态保存,数据版本快照等。
思路分析:
要点:状态可保存,可恢复。
示例工程:【用例源于《大话设计模式》】
错误写法:
创建GameRole.java文件,具体内容如下:
public class GameRole {public int vitality;public int attack;public int defense;public int getDefense() {return defense;}public void setDefense(int defense) {this.defense = defense;}public int getAttack() {return attack;}public void setAttack(int attack) {this.attack = attack;}public int getVitality() {return vitality;}public void setVitality(int vitality) {this.vitality = vitality;}public void stateDisplay(){System.out.println("当前状态:");System.out.println("体力:"+this.vitality);System.out.println("攻击力:"+this.attack);System.out.println("防御力:"+this.defense);}public void getInitState(){//此处数据可来自数据库或其他数据源this.vitality = 100;this.attack = 100;this.defense =100;}public void fight(){this.vitality =0;this.attack =0;this.defense =0;}}创建Window.java文件,具体内容如下:
public class Window {public static void main(String[] args) {GameRole l = new GameRole();l.getInitState();l.stateDisplay();GameRole b = new GameRole();b.setVitality(l.getVitality());b.setAttack(l.getAttack());b.setDefense(l.getDefense());l.fight();l.stateDisplay();l.setVitality(b.getVitality());l.setAttack(b.getAttack());l.setDefense(b.getDefense());l.stateDisplay();}}
错误原因:
备份操作向客户端暴露了过多的细节内容。对以后的对象维护与备份更新产生不利影响。
备忘录模式模板写法:
创建Caretaker.java文件,具体内容如下:
public class Caretaker {private Memento memento;public Memento getMemento() {return memento;}public void setMemento(Memento memento) {this.memento = memento;}}创建Memento.java文件,具体内容如下:
public class Memento {private String state;public Memento(Originator o){state = o.getState();}public Memento(String state) {this.state = state;}public String getState(){return state;}}
创建Originator.java文件,具体内容如下:
public class Originator {private String state;public Originator() {}public Memento createMemento(){return new Memento(state);}public void setState(String state) {this.state = state;}public String getState() {return state;}public void setMemento(Memento memento){state = memento.getState();}public void show(){System.out.println("state:"+state);}}创建Window.java文件,具体内容如下:
public class Window {public static void main(String[] args) {//初始状态Originator o = new Originator();o.setState("状态:On");o.show();//改变状态Caretaker c = new Caretaker();c.setMemento(o.createMemento());o.setState("状态:Off");o.show();//状态恢复o.setMemento(c.getMemento());o.show();}}
模式总结:
备忘录模式结构图:
备忘录模式:
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外,保存这个状态。这样以后就可将该对象回复到原先保存的状态。
组成部分:
Originator(发起人):可以根据需要决定Memento存储Originator的那些内部状态。
Memento(备忘录);
Caretaker(管理者):其可以保存一个或者多个备忘录对象,但不能对备忘录对象进行修改操作。
模式扩展:
1.在管理者中可以存在多个备忘录;
2.数据源可以有数据库,文件系统,内存缓存等等。
3.根据备忘录的时间准确恢复到指定版本。
反思:
应用场景:
- 对复杂对象中的全部或者部分状态需要进行备份操作,以便日后可以恢复。
- 需要对某一个操作执行Undo或Redo操作。
- 对历史状态的保存需要实现封装性,避免访问权限泄露。
优点:
- 当目前的状态无效或不可用时,可以将系统状态恢复到之前某一个可用的版本。
- 对备份操作实现了封装,客户端不用过多关注备份,并且也不担心备份文件被修改。
缺点:
- 备份需要占据一定量的时间,空间,某些备份场景可能会导致大量消耗。
- 详细备份内容需要精心设计以免出现,数据遗漏,空占资源等等。
-------------------------------------------------------------------------------------------------------------------------------------
至此,被说了很多遍的设计模式---备忘录模式 结束
参考资料:
图书:《大话设计模式》
其他博文:http://blog.csdn.NET/lovelion/article/details/7563445
- 被说了很多遍的设计模式---备忘录模式
- 被说了很多遍的设计模式---策略模式
- 被说了很多遍的设计模式---装饰模式
- 被说了很多遍的设计模式---代理模式
- 被说了很多遍的设计模式---原型模式
- 被说了很多遍的设计模式---外观模式
- 被说了很多遍的设计模式---观察者模式
- 被说了很多遍的设计模式---状态模式
- 被说了很多遍的设计模式---适配器模式
- 被说了很多遍的设计模式---组合模式
- 被说了很多遍的设计模式---迭代器模式
- 被说了很多遍的设计模式---命令模式
- 被说了很多遍的设计模式---访问者模式
- 被说了很多遍的设计模式---简单工厂模式
- 被说了很多遍的设计模式---工厂方法模式
- 被说了很多遍的设计模式---模板方法模式
- 被说了很多遍的设计模式---建造者模式
- 被说了很多遍的设计模式---抽象工厂模式
- php生成不同大小的图片
- 算法笔试题
- Docker 基础 - Dockerfile_0
- 使用Gmsh画非均匀网格
- SecureCRT 遇到一个致命的错误且必须关闭解决办法
- 被说了很多遍的设计模式---备忘录模式
- mysql 将字段time按天/月/年分组
- C语言中printf,scanf,getchar , puts,gets 的使用及区别
- cannot specify -s with -c or -S with multiple files
- java程序员升级路线
- 微信开发的本地测试环境
- 【BZOJ 2396】神奇的矩阵 矩阵+随机
- 如何使用程序判断系统是大端还是小端?
- SpringMVC上传文件FileUpload