설명
위키백과에 나온 내용은 다음과 같습니다.
객체 지향 방식으로 state 기계를 구현하는 행위 소프트웨어 디자인 패턴이다. State Pattern을 이용하면 state pattern 인터페이스의 파생 클래스로서 각각의 state를 구현함으로써, 또 패턴의 슈퍼클래스에 의해 정의되는 메소드를 호출하여 상태 변화를 구현함으로써 상태 기계를 구현한다.
패턴의 인터페이스에 정의된 메소드들의 호출을 통해 현재의 전략을 전환할 수 있는 Strategy Pattern으로 해석할 수 있다. (
GoF 행위
에 포함)“위키백과 - State”
- 어떤 행위를 수행할 때, state에 따라 수행되는 행위가 달라집니다.
- Strategy Pattern과 비슷합니다.
- State는
다크 모드
/라이트 모드
같은 state에 따른 토글에 이용하면 좋을 것 같다고 생각이 들었습니다.
예시 코드
라이트, 다크 모드를 각각 클래스로 생성한 뒤에 모드를 관리하는 State 클래스를 사용하여 Window 클래스에서 현재 모드를 확인하고 변경하는 동작을 수행
class State:
def show_mode(self):
print(f'현재 상태는 {self.mode} 모드 입니다.')
class LightState(State):
def __init__(self, window):
self.window = window
self.mode = 'LIGHT'
def toggle_DL(self):
print('Swiching to Dark Mode')
self.window.state = self.window.darkstate
class DarkState(State):
def __init__(self, window):
self.window = window
self.mode = 'DARK'
def toggle_DL(self):
print('Swiching to Light Mode')
self.window.state = self.window.lightstate
class Window:
def __init__(self):
self.lightstate = LightState(self)
self.darkstate = DarkState(self)
self.state = self.lightstate
def toggle_DL(self):
self.state.toggle_DL()
def show_mode(self):
self.state.show_mode()
if __name__ == '__main__':
window = Window()
actions = [window.show_mode] + [window.toggle_DL] + [window.show_mode]
actions *= 2
for action in actions:
action()
print('-'*20)
실행 결과
테스트는 아래의 절차를 2번 반복 진행했습니다.
- 현재 모드 확인
- 상태 변환
- 다시 현재 모드 확인
위의 절차를 진행했을 때, 모드의 상태입니다.
- 라이트 모드
- 다크 모드
- 다크 모드
- 라이트 모드