C# での単純なステート マシンの例

Muhammad Zeeshan 2023年10月12日
C# での単純なステート マシンの例

この記事では、プログラミング言語 C# を使用した基本的なステート マシンの例について説明します。 まず、ステート マシンを見てみましょう。

ステートマシンは、外部刺激に応答してある状態から別の状態に遷移する電子装置です。 たとえば、銀行の出納機、リモコン、実際のコンピューターなどを考えてみましょう。

C# での簡単なステート マシンの例

.NET フレームワークで 1つの状態パターンを使用して、基本的な状態機械の構築を開始しましょう。 システムがアクティブ化されると、構築するステート マシンは IT Employee Working システムになり、特定の間隔で信号を変更します。

まず、次のライブラリをインポートします。

using System;
using System.Threading;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

すべての状態が使用する SignalState と呼ばれる状態インターフェイスを作成します。

public interface SignalState {
  void Enter(Worker system);
}

次に、Worker のさまざまな状態を設定してみましょう。 初期状態は GoogleChrome で表されます。

この状態で作業員が Google Chrome の作業を終了するとします。 3秒間持続します。

public class GoogleChrome : SignalState {
  const int time = 3000;
  public void Enter(Worker system) {
    Console.WriteLine("Working in Google Chrome");
    Thread.Sleep(time);
    system.NextWorkSignal = new MSWord();
    system.ChangeSignal();
  }
}

次の状態は MS Word で、作業者は Microsoft Word で作業します。 また、3秒間持続します。

public class MSWord : SignalState {
  const int time = 3000;
  public void Enter(Worker system) {
    Console.WriteLine("Working in MS Word now");
    Thread.Sleep(time);
    system.NextWorkSignal = new SendingtoClient();
    system.ChangeSignal();
  }
}

GoogleChromeMSWord での作業が完了すると、最後の状態は SendingtoClient になります。

public class SendingtoClient : SignalState {
  const int time = 3000;
  public void Enter(Worker system) {
    Console.WriteLine("Now Sending Work to My Client");
    Thread.Sleep(time);
    system.NextWorkSignal = new GoogleChrome();
    system.ChangeSignal();
  }
}

次に、Worker の動作状態を変更する Worker クラスを作成します。

public class Worker {
  public SignalState NextWorkSignal { get; set; }
  public void Start() {
    NextWorkSignal = new MSWord();
    NextWorkSignal.Enter(this);
  }

  public void ChangeSignal() {
    Console.WriteLine("Work Changed");
    NextWorkSignal.Enter(this);
  }
}

完全なソース コード:

using System;
using System.Threading;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Worker {
  public interface SignalState {
    void Enter(Worker system);
  }

  public class GoogleChrome : SignalState {
    const int time = 3000;
    public void Enter(Worker system) {
      Console.WriteLine("Working in Google Chrome");
      Thread.Sleep(time);
      system.NextWorkSignal = new MSWord();
      system.ChangeSignal();
    }
  }

  public class MSWord : SignalState {
    const int time = 3000;
    public void Enter(Worker system) {
      Console.WriteLine("Working in MS Word now");
      Thread.Sleep(time);
      system.NextWorkSignal = new SendingtoClient();
      system.ChangeSignal();
    }
  }

  public class SendingtoClient : SignalState {
    const int time = 3000;
    public void Enter(Worker system) {
      Console.WriteLine("Now Sending Work to My Client");
      Thread.Sleep(time);
      system.NextWorkSignal = new GoogleChrome();
      system.ChangeSignal();
    }
  }

  public class Worker {
    public SignalState NextWorkSignal { get; set; }
    public void Start() {
      NextWorkSignal = new MSWord();
      NextWorkSignal.Enter(this);
    }

    public void ChangeSignal() {
      Console.WriteLine("Work Changed");
      NextWorkSignal.Enter(this);
    }
  }

  class Program {
    static void Main(string[] args) {
      Worker system = new Worker();
      system.Start();
      Console.ReadLine();
    }
  }
}

出力:

Working in MS Word now
Work Changed
Now Sending Work to My Client
Work Changed
Working in Google Chrome
Work Changed
Working in MS Word now
Work Changed
Now Sending Work to My Client
Work Changed
Working in Google Chrome
Work Changed
Working in MS Word now
......
Muhammad Zeeshan avatar Muhammad Zeeshan avatar

I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.

LinkedIn