반응형
상태 패턴이란?
- 객체의 내부 상태가 변할 때 객체의 행동이 동적으로 바뀌는 디자인 패턴
- 한 객체가 주체 역할을 하고 다른 객체가 관찰자 역할을 맡는 객체 간의 일대다 관계를 설정하는 것이 핵심!!
- 주체 역할을 맡은 객체는 내부에서 변경되었을 때 관찰자에게 알리는 책임을 진다.
- 상태 패턴을 사용하면 조건문을 많이 사용하는 코드를 객체지향적으로 리팩토링할 수 있다.
* Context 클래스 : 클라이언트가 객체 내부의 상태를 변경할 수 있도록 요청하는 인터페이스를 정의, 상태에 따라 행동이 달라지는 클래스
* IState 인터페이스 : 특정 상태에서의 행동을 정의 (각 상태별로 필요한 행동을 캡슐화한 인터페이스)
* ConcreteState 클래스(각 상태 구현) : IState 인터페이스를 구현, 상태에 따른 실제 행동을 구현한 클래스
클라이언트는 객체의 상태를 업데이트하고자 Context 객체를 활용해 원하는 상태로 설정하거나 새로운 상태로 전환할 것을 요청 , 즉 Context는 언제나 관리하는 객체의 현재 상태를 인식!!
* 같은 메서드가 호출이 되어도 상태 변화에 따라 행동이 달라진다!
사용하는 이유?
- 상태를 자주 변경하고 변경 사항을 대응해야 하는 종속성이 많은 컴포넌트가 있다면 해당 패턴을 사용하는 것을 추천!
예제
1. 구체적인 상태 클래스를 구현할 기본 인터페이스와 상태 클래스
public interface IBusState
{
void Update(BusController controller);
}
public class ArrivedState : IBusState
{
public void Update(BusController controller)
{
controller.ShowPopup("잠시 후 도착합니다.");
}
}
2. Context 클래스 구현 (현재 상태에 대한 정보를 가지고 있음)
public class BusStateContext
{
public IBusState CurrentState
{
get; set;
}
private readonly BusController _busController;
public BusStateContext(BusController busController)
{
_busController = busController;
}
public void Transition(IBusState state)
{
CurrentState = state;
CurrentState.Update(_busController);
}
}
3. Controller 클래스 (Context 오브젝트와 상태를 초기화하고 상태 변경을 트리거)
public class BikeController : MonoBehaviour
{
...
private BusStateContext _busStateContext;
private void Start() {
_busStateContext =
new BusStateContext(this);
...
}
public void UpdateState(IBusState state)
{
bikeStateContext.Transition(state);
}
public void ShowPopup...
...
}
반응형
'C# 프로그래밍 > 기초 문법' 카테고리의 다른 글
[c#] 이분 탐색 (1) | 2024.11.19 |
---|---|
[c#] 디자인 패턴 - MVC 패턴 (1) | 2024.07.23 |
[c#] 디자인 패턴 - 옵저버 패턴 (0) | 2024.07.14 |
[c#] 인터페이스란 (0) | 2024.07.14 |
[코딩테스트] c# 달리기 경주 (0) | 2023.07.20 |