Padrão State em Python

9115 ワード

O Padrão State é um padrão de projeto comportamental, implementa uma solução que altera o comportamento de um object de acordo com o seu estado interno. Está diretamente relacionado ao conceito da Máquina de Estado Finito.

Este padrão recomenda que novas classes sejam criadas para todos os estados possíveis de um object, extraindo todos os comportamentos específicos de estados para dentro dessas classes. Desta forma o objeto principal não irá implementar todos os comportamentos por conta própria, apenas irá armazenar uma referência ao object que Representativea seu estado atual, todo o trabalho relacionado ao estado será delegado para este objeto.

Exemplo do Padrão State em Python



クラスのコンテキスト




class Context:

    _state = None

    def __init__(self, state: State) -> None:
        self.transition_to(state)

    def transition_to(self, state: State):
        print(f"Context: Transition to {type(state).__name__}")
        self._state = state
        self._state.context = self

    def request1(self):
        self._state.handle1()

    def request2(self):
        self._state.handle2()


クラスのコンテキストはオブジェクトを表現するためのコンテキストであり、オブジェクトを参照するには、オブジェクトを参照する必要があります. Essa comunicação se dá attravés da interface do estado.関数 transition_to implementa um setter que recebe um novo object de estado e executa a transição.

クラッセ州




class State(ABC):

    @property
    def context(self) -> Context:
        return self._context

    @context.setter
    def context(self, context: Context) -> None:
        self._context = context

    @abstractmethod
    def handle1(self) -> None:
        pass

    @abstractmethod
    def handle2(self) -> None:
        pass


A classe State é a classe que declara os métodos que cada estado do objeto pode ter, esta possui métodos que serão especificados em cada instância de estado, desta forma devem ser declarados de forma que faça sentido para todos os estados do object.

Classe ConcreteStateA




class ConcreteStateA(State):
    def handle1(self) -> None:
        print("ConcreteStateA handles request1.")
        print("ConcreteStateA wants to change the state of the context.")
        self.context.transition_to(ConcreteStateB())

    def handle2(self) -> None:
        print("ConcreteStateA handles request2.")


class ConcreteStateB(State):
    def handle1(self) -> None:
        print("ConcreteStateB handles request1.")

    def handle2(self) -> None:
        print("ConcreteStateB handles request2.")
        print("ConcreteStateB wants to change the state of the context.")
        self.context.transition_to(ConcreteStateA())


クラス ConcreteStateA は、インスタンスのインスタンスを表し、特定のメソッドを実装します. Cada método lida com a requisição da sua maneira specific podendo fazer a transição entre outros estados na sua execução.

O uso do Padrão Stateé indicado quando um object comporta de maneira diferentedependendo do seu estado, quando o número de estados é grande, quando uma classe possui grandes blocos de condicionais que determinam seu comportamento e quando existe muito código duplicado entre estos diferentes de um object.

Python の実装は、Java の実装と関連しています.


参考文献
Padrões de Projeto (ディオゴ・モレイラ、2020)
Mergulho nos Padrões de Projeto - v2020-1.14 (Alexander Shvets、2020)
Os códigos usados como exemplo foram retirados do livro Mergulho nos Padrões de Projeto.