http://www.books.com.tw/products/0010750585
chap14.
狀態模式 State
目的:將物件的狀態封裝成類別,讓此物件隨著狀態改變時能有不同的能力
缺點:狀態變動太大時,物件會瘋狂生成。
package com.ssc24.chap14.demo01; public interface State { void move(Warrior warrior); } package com.ssc24.chap14.demo01; public class DesperateState implements State { public DesperateState() { System.out.println(">>狀態改變,背水一戰"); } @Override public void move(Warrior warrior) { int hp = warrior.getHp(); if (hp == 0) { warrior.setState(new UnableState()); warrior.move(); } else if (hp > 30) { warrior.setState(new FuryState()); warrior.move(); } else { System.out.println("HP=" + warrior.getHp() + " ,背水一戰 傷害增加50%, 防禦增加50%"); } } }
package com.ssc24.chap14.demo01; public class FuryState implements State { public FuryState() { System.out.println(">>狀態改變,狂怒狀態"); } @Override public void move(Warrior warrior) { int hp = warrior.getHp(); if (hp > 70) { warrior.setState(new NormalState()); warrior.move(); } else if (hp <= 30) { warrior.setState(new DesperateState()); warrior.move(); } else { System.out.println("HP=" + warrior.getHp() + " 狂怒狀態 傷害增加30%"); } } }
package com.ssc24.chap14.demo01; public class NormalState implements State { public NormalState() { System.out.println(">>狀態改變,一般狀態"); } @Override public void move(Warrior warrior) { if (warrior.getHp() > 70) { System.out.println("HP=" + warrior.getHp() + " ,一般狀態"); } else { warrior.setState(new FuryState()); warrior.move(); } } }
package com.ssc24.chap14.demo01; public class UnableState implements State { public UnableState() { System.out.println(">>狀態改變,無法戰鬥"); } @Override public void move(Warrior warrior) { System.out.println("HP=" + warrior.getHp() + " ,無法戰鬥"); } }
package com.ssc24.chap14.demo01; public class Warrior { private int hp; private State state; public Warrior() { this.hp = 100; state = new NormalState(); this.move(); } public void heal(int heal) { System.out.println("治療:" + heal); this.hp += heal; if (this.hp > 100) { this.hp = 100; } this.move(); } public void getDamage(int damage) { System.out.println("受到攻擊:" + damage); this.hp -= damage; if (this.hp < 0) { this.hp = 0; } this.move(); } public int getHp() { return hp; } public void setState(State state) { this.state = state; } public void move() { state.move(this); } }
package com.ssc24.chap14.demo01; import static org.junit.Assert.*; import org.junit.Test; public class WarriorTest { @Test public void test() { System.out.println("===狀態模式測試==="); Warrior warrior = new Warrior(); //warrior.move(); warrior.getDamage(30); //warrior.move(); warrior.getDamage(50); //warrior.move(); warrior.heal(120); //warrior.move(); warrior.getDamage(110); //warrior.move(); } }
/** ===狀態模式測試=== >>狀態改變,一般狀態 HP=100 ,一般狀態 受到攻擊:30 >>狀態改變,狂怒狀態 HP=70 狂怒狀態 傷害增加30% 受到攻擊:50 >>狀態改變,背水一戰 HP=20 ,背水一戰 傷害增加50%, 防禦增加50% 治療:120 >>狀態改變,狂怒狀態 >>狀態改變,一般狀態 HP=100 ,一般狀態 受到攻擊:110 >>狀態改變,狂怒狀態 >>狀態改變,背水一戰 >>狀態改變,無法戰鬥 HP=0 ,無法戰鬥 **/