행위 디자인 패턴은 객체의 역할에 중점을 둔다, 객체는 상호 작용을 통해 더 큰 기능을 구현한다. 상태 디자인 패턴은 행위 디자인 패턴의 한 종류이며 상태를 나태는 객체 패턴이라고도 불린다. 객체는 내부 상태에 따라 여러 행위를 캡슐환 한다. 상태 패턴은 런타임에 객체의 행위를 변경한다.
상태 디자인 패턴은 총3가지 요소로 구성된다
리모컨 TV
from abc import abstractmethod, ABCMeta
class State(metaclass=ABCMeta):
@abstractmethod
def doThis(self):
pass
class StartState(State):
def doThis(self):
print("TV ON")
class StopState(State):
def doThis(self):
print("TV 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()
context.setState(start)
context.doThis()
데스크톱이나 랩톱 등의 컴퓨터 시스템의 상태를 표현해보자(중지, 절전, 종료, 시작)
class ComputerState(object):
name = "state"
allowed = []
def switch(self, state):
if state.name in self.allowed:
self.__class__ = state
print("switch new state " + state.name)
else:
print("not possible")
class Off(ComputerState):
name = "off"
allowed = ["on"]
class On(ComputerState):
name = "on"
allowed = ["off", "suspend", "hibernate"]
class Suspend(ComputerState):
name = "suspend"
allowed = ["on"]
class Hibernate(ComputerState):
name = "hibernate"
allowed = ["on"]
class Computer(object):
def __init__(self, model="HP"):
self.model = model
self.state = Off()
def change(self, state):
self.state.switch(state)
comp = Computer()
print(comp.__dict__)
print(comp.__dict__['state'].name)
comp.change(On)
print(comp.__dict__['state'].name)
comp.change(Suspend)
print(comp.__dict__)
print(comp.__dict__['state'].name)