DEV Community

Michel Moreira
Michel Moreira

Posted on

Padrão Strategy em Python

O Padrão Strategy é um padrão comportamental, este padrão recomenda que uma classe que faz algo de diversas maneiras diferentes tenha estes algoritmos extraídos para classes separadas chamadas estratégias.

Exemplo de código em Python

class Context():

    def __init__(self, strategy: Strategy) -> None:

        self._strategy = strategy

    @property
    def strategy(self) -> Strategy:
        return self._strategy

    @strategy.setter
    def strategy(self, strategy: Strategy) -> None:

        self._strategy = strategy

    def do_some_business_logic(self) -> None:
        print("Context: Sorting data using the strategy (not sure how it'll do it)")
        result = self._strategy.do_algorithm(["a", "b", "c", "d", "e"])
        print(",".join(result))


class Strategy(ABC):
    @abstractmethod
    def do_algorithm(self, data: List):
        pass
Enter fullscreen mode Exit fullscreen mode

A classe Context define a interface de interesse do cliente, geralmente essa classe aceita uma estratégia no seu construtor, ela também contém um método setter para que esta seja definida em tempo de execução.

A classe Strategy declara as operações comuns para todos as estratégias.

class ConcreteStrategyA(Strategy):
    def do_algorithm(self, data: List) -> List:
        return sorted(data)


class ConcreteStrategyB(Strategy):
    def do_algorithm(self, data: List) -> List:
        return reversed(sorted(data))
Enter fullscreen mode Exit fullscreen mode

As classes ConcreteStrategy implementam seus algorítmos específicos enquanto seguem a estrutura definida pela interface Strategy. O Context usa desta interface para chamar os métodos concretos definidos.

A implementação em Python não tem nenhuma particularidade em relação a implementação em Java.


Referências
Padrões de Projeto (Diogo Moreira, 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.

Top comments (0)