オブジェクトの内部状態に応じて振る舞いを変更し、状態遷移をクラスとして表現するパターンです。
ウィキペディアの「Stateパターン」のページ
![]()

State パターン - Wikipedia
サンプルコード
/// <summary>
/// Stateパターンのサンプルコード
/// </summary>
interface IExecutionState
{
void Start(ExecuteContext context);
void Restart(ExecuteContext context);
}
class IdleState : IExecutionState
{
public void Start(ExecuteContext context)
{
Console.WriteLine("実行します。");
context.ChangeState(new RunningState());
}
public void Restart(ExecuteContext context)
{
Console.WriteLine("まずStart()してください。");
}
}
class RunningState : IExecutionState
{
public void Start(ExecuteContext context)
{
Console.WriteLine("実行中");
context.ChangeState(new AfterEndState());
}
public void Restart(ExecuteContext context)
{
Console.WriteLine("実行中");
context.ChangeState(new IdleState());
}
}
class AfterEndState : IExecutionState
{
public void Start(ExecuteContext context)
{
Console.WriteLine("終了済み");
}
public void Restart(ExecuteContext context)
{
Console.WriteLine("再開します。");
context.ChangeState(new RunningState());
}
}
class ExecuteContext
{
IExecutionState _currentState;
public ExecuteContext()
{
_currentState = new IdleState();
}
public void ChangeState(IExecutionState newState)
{
_currentState = newState;
}
public void Start()
{
_currentState.Start(this);
}
public void Restart()
{
_currentState.Restart(this);
}
}
static class Program
{
static public void Main()
{
var context = new ExecuteContext();
context.Start();
// 実行します。
context.Start();
// 実行中
context.Start();
// 終了済み
context.Restart();
// 再開します。
context.Restart();
// 実行中
context.Restart();
// まずStart()してください。
}
}
コメント