1. 程式人生 > 其它 >Halcon探索學習 | 3 資料型別

Halcon探索學習 | 3 資料型別

遊戲角色狀態恢復問題

傳統方案解決遊戲角色恢復問題

傳統解決方案的問題分析

備忘錄模式基本介紹

備忘錄模式的原理類圖

程式碼實現

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

備忘錄模式的注意事項和細節