2019年5月13日 星期一

7天學會設計模式 CHAP23 備忘錄模式 Memento

7天學會設計模式
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
**/