목차
STATE 패턴
STATE 패턴이란?
- 객체의 상태에 따라 객체의 행위가 달라 질 때 사용
- 상태별 행위를 별도의 클래스에서 구현함으로써 코드 분리가 가능, 새로운 상태를 유연하게 추가 확장 할 수 있음
- if/else 블럭으로 구현하는것보다 state 패턴을 사용하여 각 상태별로 구현하는것이 효율적일 수 있음
사용 예 , CODE
internal class Program
{
static void Main(string[] args)
{
var testPlayer = new TestPlayer();
testPlayer.ChangeState(new LoginState());
Console.ReadLine();
}
}
Main.cs
public class TestPlayer
{
public PlayerState PlayerState { get; set; }
public string PlayerNickname { get; set; }
public void ChangeState(PlayerState state)
{
Console.WriteLine($"Change state {state.GetType().Name}");
PlayerState = state;
PlayerState.SetContext(this);
// 호출!
PlayerState.Handle();
}
}
TestPlayer.cs
- 내부적으로 플레이어 이름과, 플레이어 상태값을 가진다.
// 최상위인 플레이어스테이트 클래스
// TestPlayer (context를 가지고 있다.)
public abstract class PlayerState
{
protected TestPlayer TestPlayer = null;
public void SetContext(TestPlayer player)
{
this.TestPlayer = player;
}
public abstract void Handle();
}
// playerState를 상속받은 LoginState 로그인 처리 후 "닉네임 생성 상태로 변경" 한다고 가정함.
public class LoginState : PlayerState
{
public override void Handle()
{
Console.WriteLine("LoginState State's handle, Try Loign ~");
TestPlayer.ChangeState(new CreateNicknameState());
}
}
// 닉네임 생성 상태, 닉네임을 '강백호'로 설정하고 상태 변경
public class CreateNicknameState : PlayerState
{
public override void Handle()
{
Console.WriteLine("CreateNicknameState State's handle");
TestPlayer.PlayerNickname = "강백호";
TestPlayer.ChangeState(new WaitSate());
}
}
// 기다리는 상태
public class WaitSate : PlayerState
{
public override void Handle() {
Console.WriteLine("Wait e State's handle");
Console.WriteLine($"{TestPlayer.PlayerNickname}이 서태웅, 정대만, 송태섭, 채치수를 기다리는 중");
}
}
PlayerState.cs
= 내부적으로 playerState, loginState, createNicknamestate, waitstate가 작성되어 있고 각 각 state는 playerstate를 상속받는다.
= 현재는 코드가 간단해서 안와닿을수있는데, 각 상태마다 하는일이 다양하다면 파일을 분리하여 state.cs로 처리하면 코드 관리에 더 용이 할 것으로 예상된다.
다이어그램
Code에 대한 간략한 다이어그램을 그려 보았다.

[내용 출처 및 참고]
http://www.yes24.com/Product/Goods/89510013
C#으로 이해하는 디자인 패턴 - YES24
이 책은 C#을 사용하여 디자인 패턴을 보다 쉽게 이해할 수 있도록 해설한 책입니다. 이 책은 많은 디자인 패턴들 중 자주 사용되는 패턴들에 대해 그 기본적인 개념과 구현 방법을 자세히 해설
www.yes24.com
https://refactoring.guru/ko/design-patterns/state/csharp/example
C#으로 작성된 상태 / 디자인 패턴들
refactoring.guru