[把你的理性思维慢慢变成条件反射]
好久不见,新年第一更,本文,我们讲介绍备忘录模式,文章主题结构与上文一致。惯例,先来看看我们示例工程的环境:
操作系统: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
