본문 바로가기
프로그래밍/C#

[디자인패턴]- State 패턴

by 뽀도 2023. 3. 14.

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

 

반응형

댓글