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
https://refactoring.guru/ko/design-patterns/state/csharp/example
반응형
'프로그래밍 > C#' 카테고리의 다른 글
싱글톤을 구현하는 2가지 방법 - Lazy Initialization (지연 초기화), Static Initialization (정적 초기화) (0) | 2024.06.21 |
---|---|
-1을 uint에 넣어서 형변환을 하면 어떻게 될까? (0) | 2024.05.07 |
[C#] DateTime값 Serialization/Deserialization시 DateTime.Minvalue 수치 변하는 현상. (0) | 2022.12.16 |
apple client secret 생성을 위한 jwt 만들기 (0) | 2022.07.12 |
[vs] visualstudio community 버전업시 발생하는 에러. (0) | 2022.03.30 |
댓글