C#의 단순 상태 머신 예제

Muhammad Zeeshan 2023년10월12일
C#의 단순 상태 머신 예제

이 기사에서는 프로그래밍 언어 C#을 사용하는 기본 상태 시스템의 예를 안내합니다. 먼저 상태 머신을 살펴보겠습니다.

상태 기계는 외부 자극에 반응하여 한 상태에서 다른 상태로 전환할 수 있는 모든 전자 장치입니다. 예를 들어, 은행 입출금기, 리모콘, 실제 컴퓨터 등을 생각해 보십시오.

C#의 단순 상태 머신 예제

.NET 프레임워크에서 하나의 상태 패턴을 사용하여 기본 상태 시스템 구축을 시작하겠습니다. 시스템이 활성화되면 우리가 구성할 상태 머신은 특정 간격으로 신호를 수정하는 IT 직원 작업 시스템이 됩니다.

시작하려면 다음 라이브러리를 가져옵니다.

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 크롬 작업을 완료한다고 가정해 보겠습니다. 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();
  }
}

다음 상태는 작업자가 Microsoft Word에서 작업하는 MS 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