//MageState.java
// 法師狀態介面
public interface MageState {
void cast();
void defend();
void move();
String getFormName();
}
//FireState.java
// 火焰狂怒狀態
public class FireState implements MageState {
@Override
public void cast() {
System.out.println("🔥 火焰爆發!釋放大範圍火球術!");
}
@Override
public void defend() {
System.out.println("🔥 火焰護盾展開,燒毀來犯敵人!");
}
@Override
public void move() {
System.out.println("🔥 火焰衝刺,留下燃燒足跡!");
}
@Override
public String getFormName() {
return "火焰狂怒形態";
}
}
//IceState.java
// 冰霜防禦狀態
public class IceState implements MageState {
@Override
public void cast() {
System.out.println("❄️ 冰霜風暴!凍結所有敵人!");
}
@Override
public void defend() {
System.out.println("❄️ 堅固冰牆升起,形成絕對防護!");
}
@Override
public void move() {
System.out.println("❄️ 冰面滑行,優雅且迅速!");
}
@Override
public String getFormName() {
return "冰霜防禦形態";
}
}
//LightningState.java
// 雷電突襲狀態
public class LightningState implements MageState {
@Override
public void cast() {
System.out.println("⚡ 雷霆萬鈞!閃電鏈連續打擊!");
}
@Override
public void defend() {
System.out.println("⚡ 雷電護罩反彈攻擊!");
}
@Override
public void move() {
System.out.println("⚡ 閃電瞬移,瞬間出現在敵人身後!");
}
@Override
public String getFormName() {
return "雷電突襲形態";
}
}
//StealthState.java
// 潛伏隱匿狀態
public class StealthState implements MageState {
@Override
public void cast() {
System.out.println("🌙 暗影箭矢,無聲無息命中要害!");
}
@Override
public void defend() {
System.out.println("🌙 影分身術,真身消失在陰影中!");
}
@Override
public void move() {
System.out.println("🌙 如影隨行,悄無聲息地潛行!");
}
@Override
public String getFormName() {
return "潛伏隱匿形態";
}
}
//ShapeshifterMage.java
// 變形術士(Context上下文)
public class ShapeshifterMage {
private MageState currentState;
private String name;
public ShapeshifterMage(String name) {
this.name = name;
// 預設狀態為火焰形態
this.currentState = new FireState();
}
// 切換狀態
public void changeState(MageState newState) {
this.currentState = newState;
System.out.println("✨ " + name + " 變形為:" + currentState.getFormName());
}
// 委託給當前狀態執行動作
public void cast() {
System.out.print(name + " - ");
currentState.cast();
}
public void defend() {
System.out.print(name + " - ");
currentState.defend();
}
public void move() {
System.out.print(name + " - ");
currentState.move();
}
public String getCurrentForm() {
return currentState.getFormName();
}
// 展示所有可用形態
public void showAvailableForms() {
System.out.println("=== " + name + " 的變形能力 ===");
System.out.println("🔥 火焰狂怒形態 - 強力攻擊");
System.out.println("❄️ 冰霜防禦形態 - 堅固防守");
System.out.println("⚡ 雷電突襲形態 - 快速打擊");
System.out.println("🌙 潛伏隱匿形態 - 隱密行動");
System.out.println("「我非我,我為此刻之形。」");
}
}
//StatePatternExample.java
// 使用範例
public class StatePatternExample {
public static void main(String[] args) {
System.out.println("=== 歡迎來到變形術士的魔法殿堂 ===\n");
// 創建變形術士
ShapeshifterMage mage = new ShapeshifterMage("艾莉安娜");
// 展示能力
mage.showAvailableForms();
System.out.println();
// 測試火焰形態(預設)
System.out.println("當前形態:" + mage.getCurrentForm());
mage.cast();
mage.defend();
mage.move();
System.out.println();
// 切換到冰霜防禦形態
mage.changeState(new IceState());
mage.cast();
mage.defend();
mage.move();
System.out.println();
// 切換到雷電突襲形態
mage.changeState(new LightningState());
mage.cast();
mage.defend();
mage.move();
System.out.println();
// 切換到潛伏隱匿形態
mage.changeState(new StealthState());
mage.cast();
mage.defend();
mage.move();
/**output
=== 歡迎來到變形術士的魔法殿堂 ===
=== 艾莉安娜 的變形能力 ===
🔥 火焰狂怒形態 - 強力攻擊
❄️ 冰霜防禦形態 - 堅固防守
⚡ 雷電突襲形態 - 快速打擊
🌙 潛伏隱匿形態 - 隱密行動
「我非我,我為此刻之形。」
當前形態:火焰狂怒形態
艾莉安娜 - 🔥 火焰爆發!釋放大範圍火球術!
艾莉安娜 - 🔥 火焰護盾展開,燒毀來犯敵人!
艾莉安娜 - 🔥 火焰衝刺,留下燃燒足跡!
✨ 艾莉安娜 變形為:冰霜防禦形態
艾莉安娜 - ❄️ 冰霜風暴!凍結所有敵人!
艾莉安娜 - ❄️ 堅固冰牆升起,形成絕對防護!
艾莉安娜 - ❄️ 冰面滑行,優雅且迅速!
✨ 艾莉安娜 變形為:雷電突襲形態
艾莉安娜 - ⚡ 雷霆萬鈞!閃電鏈連續打擊!
艾莉安娜 - ⚡ 雷電護罩反彈攻擊!
艾莉安娜 - ⚡ 閃電瞬移,瞬間出現在敵人身後!
✨ 艾莉安娜 變形為:潛伏隱匿形態
艾莉安娜 - 🌙 暗影箭矢,無聲無息命中要害!
艾莉安娜 - 🌙 影分身術,真身消失在陰影中!
艾莉安娜 - 🌙 如影隨行,悄無聲息地潛行!
*/
}
}
// 法師狀態基類
class MageState {
cast() {
throw new Error("子類必須實現 cast 方法");
}
defend() {
throw new Error("子類必須實現 defend 方法");
}
move() {
throw new Error("子類必須實現 move 方法");
}
getFormName() {
throw new Error("子類必須實現 getFormName 方法");
}
}
// 火焰狂怒狀態
class FireState extends MageState {
cast() {
console.log("🔥 火焰爆發!釋放大範圍火球術!");
}
defend() {
console.log("🔥 火焰護盾展開,燒毀來犯敵人!");
}
move() {
console.log("🔥 火焰衝刺,留下燃燒足跡!");
}
getFormName() {
return "火焰狂怒形態";
}
}
// 冰霜防禦狀態
class IceState extends MageState {
cast() {
console.log("❄️ 冰霜風暴!凍結所有敵人!");
}
defend() {
console.log("❄️ 堅固冰牆升起,形成絕對防護!");
}
move() {
console.log("❄️ 冰面滑行,優雅且迅速!");
}
getFormName() {
return "冰霜防禦形態";
}
}
// 雷電突襲狀態
class LightningState extends MageState {
cast() {
console.log("⚡ 雷霆萬鈞!閃電鏈連續打擊!");
}
defend() {
console.log("⚡ 雷電護罩反彈攻擊!");
}
move() {
console.log("⚡ 閃電瞬移,瞬間出現在敵人身後!");
}
getFormName() {
return "雷電突襲形態";
}
}
// 潛伏隱匿狀態
class StealthState extends MageState {
cast() {
console.log("🌙 暗影箭矢,無聲無息命中要害!");
}
defend() {
console.log("🌙 影分身術,真身消失在陰影中!");
}
move() {
console.log("🌙 如影隨行,悄無聲息地潛行!");
}
getFormName() {
return "潛伏隱匿形態";
}
}
// 變形術士(Context上下文)
class ShapeshifterMage {
constructor(name) {
this.name = name;
// 預設狀態為火焰形態
this.currentState = new FireState();
}
// 切換狀態
changeState(newState) {
this.currentState = newState;
console.log(`✨ ${this.name} 變形為:${this.currentState.getFormName()}`);
}
// 委託給當前狀態執行動作
cast() {
process.stdout.write(`${this.name} - `);
this.currentState.cast();
}
defend() {
process.stdout.write(`${this.name} - `);
this.currentState.defend();
}
move() {
process.stdout.write(`${this.name} - `);
this.currentState.move();
}
getCurrentForm() {
return this.currentState.getFormName();
}
// 展示所有可用形態
showAvailableForms() {
console.log(`=== ${this.name} 的變形能力 ===`);
console.log("🔥 火焰狂怒形態 - 強力攻擊");
console.log("❄️ 冰霜防禦形態 - 堅固防守");
console.log("⚡ 雷電突襲形態 - 快速打擊");
console.log("🌙 潛伏隱匿形態 - 隱密行動");
console.log("「我非我,我為此刻之形。」");
}
}
// 使用範例
console.log("=== 歡迎來到變形術士的魔法殿堂 ===\n");
// 創建變形術士
const mage = new ShapeshifterMage("艾莉安娜");
// 展示能力
mage.showAvailableForms();
console.log();
// 測試火焰形態(預設)
console.log(`當前形態:${mage.getCurrentForm()}`);
mage.cast();
mage.defend();
mage.move();
console.log();
// 切換到冰霜防禦形態
mage.changeState(new IceState());
mage.cast();
mage.defend();
mage.move();
console.log();
// 切換到雷電突襲形態
mage.changeState(new LightningState());
mage.cast();
mage.defend();
mage.move();
console.log();
// 切換到潛伏隱匿形態
mage.changeState(new StealthState());
mage.cast();
mage.defend();
mage.move();
/** output
=== 歡迎來到變形術士的魔法殿堂 ===
=== 艾莉安娜 的變形能力 ===
🔥 火焰狂怒形態 - 強力攻擊
❄️ 冰霜防禦形態 - 堅固防守
⚡ 雷電突襲形態 - 快速打擊
🌙 潛伏隱匿形態 - 隱密行動
「我非我,我為此刻之形。」
當前形態:火焰狂怒形態
艾莉安娜 - 🔥 火焰爆發!釋放大範圍火球術!
艾莉安娜 - 🔥 火焰護盾展開,燒毀來犯敵人!
艾莉安娜 - 🔥 火焰衝刺,留下燃燒足跡!
✨ 艾莉安娜 變形為:冰霜防禦形態
艾莉安娜 - ❄️ 冰霜風暴!凍結所有敵人!
艾莉安娜 - ❄️ 堅固冰牆升起,形成絕對防護!
艾莉安娜 - ❄️ 冰面滑行,優雅且迅速!
✨ 艾莉安娜 變形為:雷電突襲形態
艾莉安娜 - ⚡ 雷霆萬鈞!閃電鏈連續打擊!
艾莉安娜 - ⚡ 雷電護罩反彈攻擊!
艾莉安娜 - ⚡ 閃電瞬移,瞬間出現在敵人身後!
✨ 艾莉安娜 變形為:潛伏隱匿形態
艾莉安娜 - 🌙 暗影箭矢,無聲無息命中要害!
艾莉安娜 - 🌙 影分身術,真身消失在陰影中!
艾莉安娜 - 🌙 如影隨行,悄無聲息地潛行!
*/
State 設計模式就像我們故事中的多重人格變形術士,讓物件能夠根據內部狀態改變其行為
核心特點:
使用時機:
設計模式 | 核心目的 | 關注重點 |
---|---|---|
State Pattern | 讓物件能夠根據內部狀態改變行為 | 行為的動態切換 |
Factory Pattern | 負責物件的創建和選擇 | 物件的創建過程 |
State Pattern:
Factory Pattern:
State Pattern 適用場景:
// 遊戲角色狀態:健康 → 受傷 → 瀕死 → 死亡 (受傷後內部切換狀態)
GameCharacter character = new GameCharacter();
character.takeDamage(50); // 狀態:健康 → 受傷
character.takeDamage(30); // 狀態:受傷 → 瀕死
character.heal(20); // 狀態:瀕死 → 受傷
Factory Pattern 適用場景:
// 根據需求創建不同類型的武器
WeaponFactory factory = new WeaponFactory();
Weapon sword = factory.createWeapon("SWORD"); // 創建劍
Weapon bow = factory.createWeapon("BOW"); // 創建弓
// 武器創建後類型固定,不會自動變成其他武器