C#でデザインパターン「Stateパターン」

C# コンピュータ
C#

オブジェクトの内部状態に応じて振る舞いを変更し、状態遷移をクラスとして表現するパターンです。

ウィキペディアの「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()してください。
    }
}

コメント