备忘录模式

游戏角色状态恢复问题

 

 

 

传统方案解决游戏角色恢复问题

 

 

传统解决方案的问题分析

 

 

备忘录模式基本介绍

 

 

备忘录模式的原理类图

 

 

 

 

代码实现

package com.sky.memento.theory;

// 原始对象
public class Originator {

    private String state; // 状态信息

    // 提供set get 方法
    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    // 编写一个方法,可以保存一个状态对象 Memento
    public Memento saveStateMemento(){
        return new Memento(state);
    }

    // 通过备忘录对象,恢复状态
    public void getStateFromMemento(Memento memento){
        state = memento.getState();
    }
}
package com.sky.memento.theory;

// 备忘录
public class Memento {

    private String state;

    // 通过构造器进行state的注入
    public Memento(String state){
        this.state = state;
    }

    public String getState() {
        return state;
    }
}
package com.sky.memento.theory;

import java.util.ArrayList;

// 备忘录容器
public class CareTaker {

    // 创建一个备忘录集合,来保存备忘录
    private ArrayList<Memento> mementoList = new ArrayList<>();

    public void add(Memento memento){
        mementoList.add(memento);
    }

    public Memento get(int index){
        return mementoList.get(index);
    }
}
package com.sky.memento.theory;

// 客户端
public class Client {

    public static void main(String[] args) {
        Originator originator = new Originator();
        CareTaker careTaker = new CareTaker();

        originator.setState("状态#1 攻击力 100");
        // 保存了当前的状态
        careTaker.add(originator.saveStateMemento());

        originator.setState("状态#2 攻击力 80");
        // 保存了当前的状态
        careTaker.add(originator.saveStateMemento());

        originator.setState("状态#3 攻击力 50");
        // 保存了当前的状态
        careTaker.add(originator.saveStateMemento());

        System.out.println("当前的状态是 = " + originator.getState());

        // 希望得到状态1,将originator恢复到状态1
        originator.getStateFromMemento(careTaker.get(0));
        System.out.println("恢复到状态1,当前状态是 ");
        System.out.println("当前的状态是 = "+ originator.getState());

    }
}

当前的状态是 = 状态#3 攻击力 50
恢复到状态1,当前状态是
当前的状态是 = 状态#1 攻击力 100

游戏角色恢复状态的实例

 

 

思路分析及类图

 

 

代码实现

package com.sky.memento.game;

// 游戏角色 属性类
public class GameRole {

    private int vit; // 攻击力
    private int def; // 防御力

    // 创建备忘录Memento,即根据当前的状态得到Memento
    public Memento createMemento(){
        return new Memento(vit,def);
    }

    // 从备忘录对象,恢复初始状态
    public void recoveryGameRoleFromMemento(Memento memento){
        this.vit = memento.getVit();
        this.def = memento.getDef();
    }

    // 显示当前游戏的角色状态
    public void display(){
        System.out.println("当前角色的攻击力:"+ this.vit + " 防御力:"+ this.def);
    }

    // 提供get set 方法供外部进行修改
    public int getVit() {
        return vit;
    }

    public void setVit(int vit) {
        this.vit = vit;
    }

    public int getDef() {
        return def;
    }

    public void setDef(int def) {
        this.def = def;
    }
}
package com.sky.memento.game;

// 备忘录
public class Memento {

    // 攻击力
    private int vit;
    // 防御力
    private int def;

    // 通过构造器,进行初值注入
    public Memento(int vit, int def) {
        this.vit = vit;
        this.def = def;
    }

    public int getVit() {
        return vit;
    }

    public void setVit(int vit) {
        this.vit = vit;
    }

    public int getDef() {
        return def;
    }

    public void setDef(int def) {
        this.def = def;
    }
}
package com.sky.memento.game;

// 守护者对象,保存游戏角色的状态
public class Caretaker {

    // 如果只保存一次状态
    private Memento memento;
    // 如果对一个对象需要保存多次状态
//    private ArrayList<Memento> mementos;
//    // 对多个游戏角色保存多个状态
//    private HashMap<String, ArrayList<Memento>> rolesMementos;


    public Memento getMemento() {
        return memento;
    }

    public void setMemento(Memento memento) {
        this.memento = memento;
    }
}
package com.sky.memento.game;


import com.sky.memento.theory.CareTaker;

public class Client {

    public static void main(String[] args) {
        // 创建游戏角色
        GameRole gameRole = new GameRole();
        gameRole.setVit(100);
        gameRole.setDef(100);

        System.out.println("和boss大战前的状态");
        gameRole.display();

        // 把当前状态保存到 caretaker 中
        Caretaker careTaker = new Caretaker();
        careTaker.setMemento(gameRole.createMemento());

        System.out.println("和boss 大战~~~");
        gameRole.setVit(50);
        gameRole.setDef(50);
        gameRole.display();

        System.out.println("大战后,使用备忘录对象恢复到战前");

        gameRole.recoveryGameRoleFromMemento(careTaker.getMemento());
        gameRole.display();

    }
}

和boss大战前的状态
当前角色的攻击力:100 防御力:100
和boss 大战~~~
当前角色的攻击力:50 防御力:50
大战后,使用备忘录对象恢复到战前
当前角色的攻击力:100 防御力:100

备忘录模式的注意事项和细节

 

 

 

posted on 2022-12-13 10:04  ~码铃薯~  阅读(29)  评论(0编辑  收藏  举报

导航