狀態模式:允許物件在內部狀態改變時改變行為,彷彿變更了其類別。
將狀態判斷邏輯遷移至代表各狀態的獨立類別,簡化主邏輯。

ConcreteState 實例定義當前狀態。public class Context {
public State State { get; set; }
public Context(State s) { State = s; Console.WriteLine($"初始狀態: {s.GetType().Name}"); }
public void Request() => State.Handle(this);
}
public abstract class State { public abstract void Handle(Context ctx); }
public class ConcreteStateA : State { public override void Handle(Context c) => c.State = new ConcreteStateB(); }
public class ConcreteStateB : State { public override void Handle(Context c) => c.State = new ConcreteStateC(); }
public class ConcreteStateC : State { public override void Handle(Context c) => c.State = new ConcreteStateA(); }
// Client
Context ctx = new Context(new ConcreteStateA());
ctx.Request(); ctx.Request(); ctx.Request(); // A→B→C→A 循環


三狀態:RedState (透支)、SilverState (新戶)、GoldState (優質)。依餘額自動轉換:
// Context: Account
class Account {
private State _state; private string _owner;
public Account(string owner) { _owner=owner; _state=new SilverState(0,this); }
public double Balance => _state.Balance;
public State State { get=>_state; set=>_state=value; }
public void Deposit(double amt) { _state.Deposit(amt); Log(); }
public void Withdraw(double amt) { _state.Withdraw(amt); Log(); }
public void PayInterest() { _state.PayInterest(); Log(); }
void Log() => Console.WriteLine($"Balance={Balance:C} Status={State.GetType().Name}\n");
}
// Abstract State
abstract class State {
protected Account account; protected double balance, interest, lowerLimit, upperLimit;
public Account Account { get=>account; set=>account=value; }
public double Balance { get=>balance; set=>balance=value; }
public abstract void Deposit(double amt);
public abstract void Withdraw(double amt);
public abstract void PayInterest();
}
// Concrete States: RedState, SilverState, GoldState
// 各自實作 Deposit/Withdraw/PayInterest 並在 StateChangeCheck() 中依餘額切換狀態
// 例: SilverState.StateChangeCheck()
private void StateChangeCheck() {
if (balance < lowerLimit) account.State = new RedState(this);
else if (balance > upperLimit) account.State = new GoldState(this);
}
Account acc = new Account("Jim Johnson");
acc.Deposit(500); acc.Deposit(300); acc.Deposit(550); // 進入 Gold
acc.PayInterest();
acc.Withdraw(2000); acc.Withdraw(1100); // 回落 Silver/Red
Console.ReadKey();

狀態模式將狀態相關行為封裝於獨立類別,Context 委派給當前狀態物件,消除龐大條件判斷,符合開放封閉原則。適用於狀態轉換邏輯固定但行為差異大的場景。