본문 바로가기

설계

[디자인 패턴] 스테이트 패턴 (State Pattern) - python 예제 코드

State Pattern은 객체 지향 디자인 패턴 중 하나로, 객체의 내부 상태(state)에 따라서 객체의 행위를 변화시키는 방식을 제공합니다. 객체의 행위를 변화시키는 것은 객체의 메소드 호출을 통해서 이루어지지만, 이러한 호출은 객체의 상태에 따라 다른 메소드를 호출하게 됩니다. 이러한 상태를 캡슐화하고, 각 상태에 대한 행위를 별도의 객체로 분리하여 관리하게 됩니다.

1. 예제코드


주문 상태에 따라 다른 행위를 수행하는 주문 시스템을 구현한다고 가정해봅시다. 주문은 다음과 같은 세 가지 상태를 가질 수 있습니다.

  • 주문 접수 대기중
  • 주문 처리중
  • 주문 완료

각 상태에 따라 수행되는 행위가 다르기 때문에, 이러한 상태를 객체로 분리하여 관리할 수 있습니다. 이를 State Pattern으로 구현하면, 다음과 같이 구현할 수 있습니다.

from abc import ABC, abstractmethod

class OrderState(ABC):
    @abstractmethod
    def process_order(self):
        pass

class Order:
    def __init__(self):
        self.state = OrderPendingState()

    def process(self):
        self.state.process_order()

class OrderPendingState(OrderState):
    def process_order(self):
        print("주문이 접수되었습니다. 처리 중입니다.")

class OrderProcessingState(OrderState):
    def process_order(self):
        print("주문이 처리중입니다. 잠시만 기다려주세요.")

class OrderCompleteState(OrderState):
    def process_order(self):
        print("주문이 완료되었습니다. 감사합니다.")

order = Order()
order.process()  # Output: "주문이 접수되었습니다. 처리 중입니다."

order.state = OrderProcessingState()
order.process()  # Output: "주문이 처리중입니다. 잠시만 기다려주세요."

order.state = OrderCompleteState()
order.process()  # Output: "주문이 완료되었습니다. 감사합니다."


위의 코드에서 OrderState는 상태를 나타내는 추상 클래스입니다. OrderPendingState, OrderProcessingState, OrderCompleteState는 각각 주문의 상태를 구현한 클래스입니다. Order는 주문 객체를 나타내는 클래스이며, 주문 객체는 현재의 상태를 가지고 있습니다. process() 메소드는 현재 상태에 따라 process_order() 메소드를 호출합니다. 이렇게 함으로써, 객체의 상태에 따라 다른 행위를 수행할 수 있습니다.

State Pattern은 객체 지향 프로그래밍에서 유용한 패턴 중 하나입니다. 객체의 상태에 따라 다른 행위를 수행하는 로직을 관리하고, 객체를 상태를 변화시키는 데 유용합니다. 또한, 상태에 따른 메소드 호출을 분리하여 코드를 관리할 수 있으므로 코드의 가독성과 유지보수성을 높일 수 있습니다.

2. 장점

  • 객체의 상태에 따른 행위를 관리하기 쉽습니다.
  • 코드의 가독성과 유지보수성을 높일 수 있습니다.
  • 상태를 캡슐화하므로 객체의 내부 구현을 숨길 수 있습니다.
  • 객체의 상태 변화에 대한 로직을 한 곳에 집중할 수 있습니다.

3. 단점

  • 상태 클래스가 많아지면 코드의 복잡성이 증가할 수 있습니다.
  • 상태 간의 전이(transition)를 처리하기 위한 추가적인 코드가 필요할 수 있습니다.
  • 상태 간 전이가 복잡할 경우 처리가 어려울 수 있습니다.

State Pattern은 객체 지향 프로그래밍에서 많이 사용되는 패턴 중 하나입니다. 객체의 상태에 따라 다른 행위를 수행하는 로직을 관리하고, 객체를 상태 변화에 따라 변경하는 데 유용합니다. 따라서 State Pattern은 객체 지향 프로그래밍에서 객체의 내부 구현을 캡슐화하고 유지보수성을 높이는 데 큰 역할을 합니다.