情节:如果再给我一次机会。。。
定义:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
结构图:
public class GameRole {
public int vit;
public int atk;
public int defense;
public int getVit() {
return vit;
}
public void setVit(int vit) {
this.vit = vit;
}
public int getAtk() {
return atk;
}
public void setAtk(int atk) {
this.atk = atk;
}
public int getDefense() {
return defense;
}
public void setDefense(int defense) {
this.defense = defense;
}
public void StateDisplay(){
System.out.println("VIT"+this.vit);
System.out.println("ATK"+this.atk);
System.out.println("DEFENSE"+this.defense);
}
public void GetInitState(){
this.atk = 100;
this.defense = 100;
this.vit = 100;
}
public void Fight(){
this.atk = 0;
this.defense = 0;
this.vit = 0;
}
//保存角色状态
public Memento SaveState(){
return new Memento(vit, atk, defense);
}
//恢复角色状态
public void RecoveryState(Memento memento){
this.atk = memento.atk;
this.defense = memento.defense;
this.vit = memento.vit;
}
}
public class Memento {
//体力,攻击力,防御力
public int vit;
public int atk;
public int defense;
public Memento(int vit, int atk, int defense) {
super();
this.vit = vit;
this.atk = atk;
this.defense = defense;
}
public int getVit() {
return vit;
}
public void setVit(int vit) {
this.vit = vit;
}
public int getAtk() {
return atk;
}
public void setAtk(int atk) {
this.atk = atk;
}
public int getDefense() {
return defense;
}
public void setDefense(int defense) {
this.defense = defense;
}
}
public class Caretaker {
private Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
public class Client {
public static void main(String[] args) {
//大战前
GameRole xiaoRole = new GameRole();
xiaoRole.GetInitState();
xiaoRole.StateDisplay();
//保存进度
Caretaker stateAdmin = new Caretaker();
stateAdmin.setMemento(xiaoRole.SaveState());
//大战时
xiaoRole.Fight();
xiaoRole.StateDisplay();
//恢复之前状态
xiaoRole.RecoveryState(stateAdmin.getMemento());
xiaoRole.StateDisplay();
}
}
把要保存的细节封装在Memento中,哪一天要更改保存的细节就不用影响客户端了
比较适用于功能比较复杂的,但需要维护或记录属性历史的类;需要保存的属性只是众多属性的一小部分时,Originator可以根据保存的Memento信息还原到前一状态。