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