Beispiel für einen einfachen Zustandsautomaten in C#

Muhammad Zeeshan 12 Oktober 2023
Beispiel für einen einfachen Zustandsautomaten in C#

Dieser Artikel führt Sie durch ein Beispiel für einen einfachen Zustandsautomaten mit der Programmiersprache C#. Schauen wir uns zuerst die Zustandsmaschine an.

Zustandsmaschinen sind alle elektronischen Geräte, die als Reaktion auf externe Stimuli von einem Zustand in einen anderen übergehen können. Nehmen Sie zum Beispiel einen Bankschalter, eine Fernbedienung, den eigentlichen Computer usw.

Beispiel einer einfachen Zustandsmaschine in C#

Beginnen wir mit dem Aufbau einer einfachen Zustandsmaschine mit einem Zustandsmuster im .NET-Framework. Sobald das System aktiviert ist, wird die Zustandsmaschine, die wir konstruieren, ein IT Employee Working-System sein, das die Signale in bestimmten Intervallen ändert.

Importieren Sie zunächst die folgenden Bibliotheken.

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

Erstellen Sie eine Zustandsschnittstelle namens SignalState, die von allen Zuständen verwendet wird.

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

Als nächstes richten wir die verschiedenen Zustände für den Worker ein. Der Anfangszustand wird mit GoogleChrome bezeichnet.

Nehmen wir an, der Mitarbeiter beendet seine Google Chrome-Arbeit in diesem Zustand. Es dauert 3 Sekunden.

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();
  }
}

Der nächste Stand wird MS Word sein, wo die Arbeiter mit Microsoft Word arbeiten werden. Es dauert auch 3 Sekunden.

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();
  }
}

Nach Abschluss seiner Arbeit an GoogleChrome und MSWord ist der letzte Zustand 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();
  }
}

Jetzt erstellen wir eine Worker-Klasse, die den Arbeitsstatus von Worker ändert.

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);
  }
}

Vollständiger Quellcode:

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();
    }
  }
}

Ausgang:

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