Ejemplo de máquina de estado simple en C#

Muhammad Zeeshan 12 octubre 2023
Ejemplo de máquina de estado simple en C#

Este artículo lo guiará a través de un ejemplo de una máquina de estado básica que utiliza el lenguaje de programación C#. Veamos primero la máquina de estado.

Las máquinas de estado son cualquier aparato electrónico que puede pasar de un estado a otro en respuesta a estímulos externos. Tomemos, por ejemplo, un cajero automático de un banco, un control remoto, la computadora real, etc.

Ejemplo de máquina de estado simple en C#

Comencemos a construir una máquina de estado básica utilizando un patrón de estado en el marco .NET. Una vez activado el sistema, la máquina de estados que construiremos será un sistema IT Employee Working, que modifica las señales a intervalos determinados.

Para comenzar, importe las siguientes bibliotecas.

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

Cree una interfaz de estado llamada SignalState, que usarán todos los estados.

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

A continuación, sigamos adelante y configuremos los diferentes estados para el Trabajador. El estado inicial se denota por GoogleChrome.

Supongamos que el trabajador terminará su trabajo de Google Chrome en este estado. Durará 3 segundos.

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

El siguiente estado será MS Word, donde los trabajadores trabajarán en Microsoft Word. También tendrá una duración de 3 segundos.

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

Después de completar su trabajo en GoogleChrome y MSWord, el último estado será 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();
  }
}

Ahora, crearemos una clase Trabajador que cambiará el estado de trabajo de Trabajador.

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

Código fuente completo:

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

Producción :

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