상태 (State) 패턴 행동 패턴
객체의 다양한 상태를 객체화하여 객체가 상태에 따라 다른 행동을 할 수 있게 합니다.
어떤 객체는 조건에 따라 하나의 상태를 가져 상태에 따라 다른 행동을 할 수가 있다. 예를 들어, 어떤 게임 속 플레이어는 서 있거나, 걷거나 뛸 수 있다. 그러므로 플레이어는 이동에 대한 상태를 가질 수 있다. 그리고 플레이어가 서 있으면서 뛸 수 없듯이, 객체는 하나의 상태만 가질 수 있고, 서 있던 플레이어가 외부 입력을 통해 달리게 되듯이 객체는 상태를 바꿀 수 있다(상태 전이). 이런 객체의 형태를 유한 상태 기계(Finite-State Machine, FSM)라고 하는데, 이는 소프트웨어를 설계하는 데에 쓰이는 추상적인 모델이다.
그렇다면, 이제 유한 상태 기계를 구현한 객체를 프로그래밍 해보자. 객체는 상태에 따라 행동을 달리해야 함으로 조건문으로 분기를 나눠 상태에 따른 행동을 구현할 수 있다. 하지만 구현해야 할 상태가 추가된다면, 상태를 가진 객체에 있는 조건문도 따로 수정해야 할 필요가 있어 확장에 대한 유연성이 떨어지게 된다. 그래서, GoF 디자인 패턴에서 제시하는 상태 패턴을 이용하면 객체 지향 프로그래밍에 적합한 유한 상태 기계를 구현할 수 있다.
상태 (State) 패턴은 상태를 객체화 하여 각각의 상태 객체마다 다른 행동을 정의할 수 있게 한다. 대상은 상태 객체를 하나만 참조할 수 있고, 조건에 따라 다른 상태 객체로 바꾸어 자신의 행동 양상을 전환할 수가 있다. 클라이언트 입장에서는 객체가 자신의 클래스를 바꾸는 것처럼 보이게 된다.
상태 패턴을 사용한다면 상태에 대한 행동을 하나의 객체 안으로 캡슐화할 수 있고, 상태를 사용하는 객체는 직접 조건을 통해 분기하는 대신에 상태 객체를 통하여 상태에 대한 개방-폐쇄 원칙을 준수하는 유연한 확장을 지원할 수 있게 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | public class PatternState { public class Context { private IState _state; public Context() { _state = new StateA(); } public void SetState(IState state) { _state = state; } public void Operation() { _state.Operation(this); } } public interface IState { void Operation(Context context); } public class StateA : IState { public void Operation(Context context) { Console.WriteLine("Operate StateA"); context.SetState(new StateB()); } } public class StateB : IState { public void Operation(Context context) { Console.WriteLine("Operate StateB"); context.SetState(new StateA()); } } public static void Main(string[] args) { Context context = new Context(); for (int num = 0; num < 3; num++) { context.Operation(); } } } | cs |
1 2 3 4 | Operate StateA Operate StateB Operate StateA Press any key to continue . . . | cs |
위의 예제에서 Context 객체는 처음으로 StateA 객체를 상태로 가져 Operation() 에 대한 행동을 StateA 객체에서 수행하게 된다. 그러나 StateA 객체의 Operation() 은 Context 객체의 상태를 StateB 객체로 전이하는 내용을 포함하기에 이후 Context 객체의 상태는 StateB 객체로 전환되었다.
그리고 StateB 객체의 Operation() 은 Context 객체의 상태를 StateA 객체로 전이하는 내용을 포함하여 두 번째 Operation() 의 호출 이후 Context 객체의 상태는 StateA 객체로 전환되었다. 이하 생략.
'PROGRAMMING > Design Pattern' 카테고리의 다른 글
[GoF] 전략 (Strategy) 패턴 (0) | 2019.03.09 |
---|---|
[GoF] 해석자 (Interpreter) 패턴 (0) | 2019.03.09 |
[GoF] 명령 (Command) 패턴 (0) | 2019.03.09 |
[GoF] 관찰자 (Observer) 패턴 (0) | 2019.03.09 |
[GoF] 책임 연쇄 (Chain of Responsibility) 패턴 (0) | 2019.03.09 |