设计模式笔记----备忘录模式

一,问题引入

游戏角色状态恢复问题

游戏角色又攻击力和防御力,在大战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 私信 关注
上一篇:ResNet被全面超越了,是Transformer干的:依图科技开源“可大可小”T2T-ViT,轻量版优于MobileNet


下一篇:Transformer有可能替代CNN吗?未来有哪些研究方向?听听大家都怎么说