상태 디자인 패턴

런던행·2020년 8월 14일
0

디자인 패턴

목록 보기
7/8

상태 디자인 패턴 개요

행위 디자인 패턴은 객체의 역할에 중점을 둔다, 객체는 상호 작용을 통해 더 큰 기능을 구현한다. 상태 디자인 패턴은 행위 디자인 패턴의 한 종류이며 상태를 나태는 객체 패턴이라고도 불린다. 객체는 내부 상태에 따라 여러 행위를 캡슐환 한다. 상태 패턴은 런타임에 객체의 행위를 변경한다.

상태 패턴의 이해

상태 디자인 패턴은 총3가지 요소로 구성된다

  • State: 객체의 행위를 캡슐화하는 인터페이스다. 행위는 객체의 상태에 따라 변한다.
  • ConcreateState: State 인터페이스를 구현하는 서브클래스다. 특정상태의 객체의 행위를 구현한다.
  • Context: 사용자가 선택한 인터페이스를 정의한다. 특정 상태의 객체를 구현한 ConcreteState 서브클래스의 인스턴스를 가지고 있다.

UML

  • State : Handle() 추상 메소드를 정의하는 인터페이스
  • ConcreateState: State 설정에 따라 실행될 각자의 Handle()메소드를 구현한다.
  • Context: 사용자의 요청을 넘겨받는 클래스다.

상태 디자인 패턴 예제

리모컨 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()

예제2

데스크톱이나 랩톱 등의 컴퓨터 시스템의 상태를 표현해보자(중지, 절전, 종료, 시작)

  • ComputerState인터페이스에는 name, allowed 속성을 정의한다. name은 객체의 상태를 나타내며, allowed는 해당 객체에 허용된 모든 상태의 목록, switch()메소드를 정의한다.
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)
profile
unit test, tdd, bdd, laravel, django, android native, vuejs, react, embedded linux, typescript

0개의 댓글