C# 프로그래밍/기초 문법

[c#] 디자인 패턴 - 상태 패턴

내공부방 2024. 7. 28. 23:02
반응형

상태 패턴이란?

- 객체의 내부 상태가 변할 때 객체의 행동이 동적으로 바뀌는 디자인 패턴

- 한 객체가 주체 역할을 하고 다른 객체가 관찰자 역할을 맡는 객체 간의 일대다 관계를 설정하는 것이 핵심!!

- 주체 역할을 맡은 객체는 내부에서 변경되었을 때 관찰자에게 알리는 책임을 진다.

- 상태 패턴을 사용하면 조건문을 많이 사용하는 코드를 객체지향적으로 리팩토링할 수 있다.

 

* 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