Stateパターン
if文の分岐が多い時に適用できる
個々の取りうる状態をclassとして列挙する
それとは別に、「今の状態」を管理するclassも設ける
状態AからBへ遷移する、といったロジックは、Aのclassの中に書かれる
gpt-4.icon
Stateパターンは、オブジェクトの内部状態が変更すると、オブジェクトの振る舞いも変更する設計パターンで、オブジェクト指向プログラミングにおける振る舞いのパターンの一つです。
状態を具体的なクラスで表現し、それらのクラスが変更可能な振る舞いを定義します。状態の変更は、実質的にはクラスの交換を意味します。
以下に、TypeScriptを用いてStateパターンを表現した例を挙げてみます。ここでは、Context クラスが State インターフェースを持ち、State インターフェースを実装した ConcreteStateA と ConcreteStateB が存在します。
code:ts
// Stateインターフェースの定義
interface State {
handle(context: Context): void;
}
// ConcreteStateAの定義
class ConcreteStateA implements State {
public handle(context: Context): void {
console.log('Handling in Concrete State A');
context.setState(new ConcreteStateB());
}
}
// ConcreteStateBの定義
class ConcreteStateB implements State {
public handle(context: Context): void {
console.log('Handling in Concrete State B');
context.setState(new ConcreteStateA());
}
}
// Contextクラスの定義
class Context {
private state: State;
constructor(state: State) {
this.state = state;
}
public setState(state: State): void {
this.state = state;
}
public request(): void {
this.state.handle(this);
}
}
// 実行例
const context = new Context(new ConcreteStateA());
context.request(); // Outputs: "Handling in Concrete State A"
context.request(); // Outputs: "Handling in Concrete State B"
この例では、Contextは内部のStateオブジェクトによって振る舞いを変更します。具体的にはrequestメソッドを呼び出す度に、現在の状態がハンドルされ、状態が交換されます。このパターンは、状態遷移が複雑なシステムに対して特に有用であり、状態によって変わる振る舞いを個々のクラスに分離できるため、コードの可読性やメンテナンス性を向上させることができます。