http://www.books.com.tw/products/0010750585
chap23.
備忘錄模式 Memento
目的:將一個物件的內部狀態儲存在另外一個備忘錄物件中,備忘錄物件可用來還原物件狀態
package com.ssc24.chap23.demo01; public class GameRole { private int hp = 100; private int atk = 100; private int def = 100; private String name = "第六天魔王"; public RoleStateMemo save() { return new RoleStateMemo(hp,atk,def); } public void fight() { hp = 30; System.out.println(name + "剩下 30% 血量,出大招把隊伍打的半死"); } public void stateDisplay() { System.out.println(name + " 的狀態:"); System.out.print("hp=" + hp); System.out.print(" ,atk=" + atk); System.out.print(" ,def=" + def); } public void load(RoleStateMemo memo) { this.hp = memo.getHp(); this.atk = memo.getAtk(); this.def = memo.getDef(); } public int getHp() { return hp; } public void setHp(int hp) { this.hp = hp; } public int getAtk() { return atk; } public void setAtk(int atk) { this.atk = atk; } public int getDef() { return def; } public void setDef(int def) { this.def = def; } }
package com.ssc24.chap23.demo01; import java.util.ArrayList; import java.util.List; public class RoleStateCareTaker { public List<RoleStateMemo> saves = new ArrayList<RoleStateMemo>(); public RoleStateMemo getSave() { return saves.get(0); } public void setSave(RoleStateMemo memo) { saves.add(0,memo); } }
package com.ssc24.chap23.demo01; public class RoleStateMemo { private int hp; private int atk; private int def; public RoleStateMemo(int hp,int atk,int def) { this.hp = hp; this.atk = atk; this.def = def; } public int getHp() { return hp; } public void setHp(int hp) { this.hp = hp; } public int getAtk() { return atk; } public void setAtk(int atk) { this.atk = atk; } public int getDef() { return def; } public void setDef(int def) { this.def = def; } }
package com.ssc24.chap23.demo01; import static org.junit.Assert.*; import org.junit.Test; public class GameRoleTest { @Test public void test() { GameRole boss = new GameRole(); boss.stateDisplay(); System.out.println("使用複雜的神秘小技巧"); boss.setAtk(60); RoleStateCareTaker rsc = new RoleStateCareTaker(); rsc.setSave(boss.save()); boss.stateDisplay(); boss.fight(); boss.stateDisplay(); boss.load(rsc.getSave()); System.out.println("不行不行,那個時間點該先回滿血,讀檔重打"); boss.stateDisplay(); } }
/** 第六天魔王 的狀態: hp=100 ,atk=100 ,def=100使用複雜的神秘小技巧 第六天魔王 的狀態: hp=100 ,atk=60 ,def=100第六天魔王剩下 30% 血量,出大招把隊伍打的半死 第六天魔王 的狀態: hp=30 ,atk=60 ,def=100不行不行,那個時間點該先回滿血,讀檔重打 第六天魔王 的狀態: hp=100 ,atk=60 ,def=100 **/