一,问题引入
游戏角色状态恢复问题
游戏角色又攻击力和防御力,在大战boss之前保存自身状态(攻击力和防御力),当大战boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状态
二,备忘录模式
1.备忘录模式在不被破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态
2.备忘录对象主要用来记录一个对象的某种状态,或者某些数据,当要做回退时,可以从备忘录对象里获取原来的数据
3.备忘录模式时行为模式
4.代码
Originator:需要保存状态的对象
package 设计模式.备忘录模式;
public class Originator {
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
//编写一个方法,可以保存一个状态对象Memento
public Memento saveMemento(){
return new Memento(state);
}
//恢复到某一个状态
public void getStateFromMemento(Memento memento){
state=memento.getState();
}
}
Memento:用于保存状态的对象,备忘录对象
package 设计模式.备忘录模式;
public class Memento {
private String state;
public Memento(String state){
this.state=state;
}
public String getState(){
return state;
}
}
Caretaker:用于存储多个(Mmemento)状态对象
package 设计模式.备忘录模式;
import java.util.ArrayList;
import java.util.List;
public class Caretaker {
private List<Memento>list=new ArrayList<>();
public void add(Memento memento){
list.add(memento);
}
public Memento get(int idx){
return list.get(idx);
}
}
Client:使用
package 设计模式.备忘录模式;
import sun.awt.geom.AreaOp;
public class Client {
public static void main(String []args){
Originator originator=new Originator();
originator.setState("状态一");
Caretaker caretaker=new Caretaker();
//保存状态
caretaker.add(originator.saveMemento());
originator.setState("状态二");
caretaker.add(originator.saveMemento());
originator.setState("状态三");
caretaker.add(originator.saveMemento());
System.out.println(originator.getState());
//当前状态为状态三,假设要恢复到状态一
originator.getStateFromMemento(caretaker.get(0));
System.out.println(originator.getState());
}
}
三,问题一代码实现
GameRole:游戏对象
package 设计模式.备忘录模式.案例实现;
public class GameRole {
private int vit;
private int Pro;
public int getPro() {
return Pro;
}
public void setPro(int pro) {
Pro = pro;
}
public int getVit() {
return vit;
}
public void setVit(int vit) {
this.vit = vit;
}
public Memento saveMemento(){
return new Memento(vit,Pro);
}
public void recoverGameRole(Memento memento){
this.vit=memento.getVit();
this.Pro=memento.getPro();
}
public void disPlay(){
System.out.println("攻击力"+vit+"防御力"+Pro);
}
}
Memento:备忘录对象
package 设计模式.备忘录模式.案例实现;
public class Memento {
private int vit;
private int pro;
public Memento(int vit,int pro){
this.vit=vit;
this.pro=pro;
}
public int getPro() {
return pro;
}
public void setPro(int pro) {
this.pro = pro;
}
public int getVit() {
return vit;
}
public void setVit(int vit) {
this.vit = vit;
}
}
Caretaker
package 设计模式.备忘录模式.案例实现;
import java.io.PrintWriter;
import java.util.List;
public class Carretaker {
private Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
Client:使用
package 设计模式.备忘录模式.案例实现;
import 设计模式.备忘录模式.Caretaker;
public class Client {
public static void main(String []args){
GameRole gameRole=new GameRole();
Carretaker caretaker=new Carretaker();
gameRole.setPro(100);
gameRole.setVit(100);
gameRole.disPlay();
//保存状态
caretaker.setMemento(gameRole.saveMemento());
System.out.println("和Boss大战");
gameRole.setVit(30);
gameRole.setPro(30);
gameRole.disPlay();
System.out.println("恢复");
//使用备忘录对象恢复
gameRole.recoverGameRole(caretaker.getMemento());
gameRole.disPlay();
}
}
java的舔狗 发布了44 篇原创文章 · 获赞 19 · 访问量 1064 私信 关注