[把你的理性思维慢慢变成条件反射]
好久不见,新年第一更,本文,我们讲介绍备忘录模式,文章主题结构与上文一致。惯例,先来看看我们示例工程的环境:
操作系统: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.根据备忘录的时间准确恢复到指定版本。
-------------------------------------------------------------------------------------------------------------------------------------
至此,被说了很多遍的设计模式---备忘录模式 结束
参考资料:
图书:《大话设计模式》
其他博文:http://blog.csdn.NET/lovelion/article/details/7563445
原文:http://blog.csdn.net/abcd898989/article/details/54880306