9_state_degin_pattern

9. state desgom patterm

1. 상태 디자인 패턴 개요

행위 디자인패턴은 객체의 역할에 중점을 둔다
객체는 내부 상태에 따라 여러 행위를 캡슐화 한다. 상태 패턴은 런타임에 객체의 행위를 변경

  • 상태 디자인 패턴의 구성 요소
    State : 객체의 행위를 캡슐화하는 인터페이스
    ConcreteState : State 인터페이스를 구현하는서브클래스.
    Context : 사용자가 선택한 인터페이스를 정의. 특정 상태의 구현한 ConcreteState 서브클래스의 인스턴스를 가지고 있다.
__author__ = 'Chetan'

from abc import abstractmethod, ABCMeta

class State(metaclass=ABCMeta):
    
    @abstractmethod
    def doThis(self):
        pass

class StartState (State):
    def doThis(self):
        print("TV Switching ON..")

class StopState (State):
    def doThis(self):
        print("TV Switching OFF..")

class TVContext(State):
    
    def __init__(self):
        self.state = None
    
    def getState(self):
        return self.state
    
    def setState(self, state):
        self.state = state
    
    def doThis(self):
        self.state.doThis()


context = TVContext()
context.getState()
start = StartState()
stop = StopState()

context.setState(stop)
context.doThis()
  • 위 코드에서의 역할
    State : Handle() 추상 메소드를 정의하는 인터페이스
    -> ConcreteState가 구현
    ConcreteState : State 설정에 따라 실행될 각 Handle() 메소드를 구현
    Context : 사용자의 요청을 넘겨받는 클래스

2. 상태 디자인 패턴의 장단점

  • 상태 디자인 패턴의 장점
    상황에 따라 if else와 같은 조건부 연산을 줄일 수 있다.
    다형성(Polymorphic) 구현이 쉬우며 새로운 상태를 쉽게 추가할 수 있다
    상태 관련 행위가 모두 ConcreteState 클래스에 있으므로 응집도(Cohesion)가 높아진다.
    새로운 ConcreteState 클래스를 추가해 쉽게 신규 기능을 구현할 수 있다.
  • 상태 디자인 패턴의 단점
    클래스 남발(Class Explosion)이 나타단다.
    새로운 행위는 ConcreteState를 새로 추가하면 되지만 Context 클래스도 맞게 수정해줘야 한다.