Como você pode aprender o Padrão de Design da Estratégia? Faça um hambúrguer!

Você sabe como pedir um hambúrguer?

Se assim for, tenho boas notícias para você. Então você sabe como usar um dos padrões de design mais usados, o padrão de estratégia!

"Como assim?", Você pode perguntar. Bem, vamos dar uma olhada nos recursos do padrão de estratégia.

  • Ele define uma família de algoritmos.
  • Ele encapsula cada algoritmo.
  • Torna os algoritmos intercambiáveis ​​dentro dessa família.

O padrão de estratégia permite que o algoritmo varie independentemente dos clientes que o utilizam.

Você se sente tão confuso quanto esse cara?

Como isso tem algo a ver com hambúrgueres?

Vamos pensar em hambúrgueres por um segundo.

Existem muitas variedades de hambúrgueres: hambúrguer vegetariano, cheeseburger, hambúrguer de frango grelhado e cheeseburger duplo, para citar alguns. Todos eles compartilham o mesmo formato: o bolo superior + patty + bolo inferior.

É a empada que torna cada hambúrguer diferente. Um cheeseburger tem queijo e um hambúrguer no meio, enquanto um hambúrguer de frango grelhado tem um hambúrguer de peito de frango grelhado.

Vamos recapitular a definição do padrão de estratégia em termos de hambúrgueres. Qual é a família de algoritmos em termos de hambúrgueres? É a família de diferentes hambúrgueres:

  • empada para um hambúrguer de frango = [peito de frango grelhado]
  • empada para um cheeseburger = [queijo + empada]
  • empada para um cheeseburger duplo = [queijo + empada + queijo + empada]

Eles são encapsulados e intercambiáveis ​​entre si. Troque o hambúrguer de frango com o hambúrguer de cheeseburguer e você ganha um cheeseburguer.

A estratégia permite que o algoritmo varie independentemente dos clientes que o utilizam.

Você pode pedir qualquer hambúrguer que quiser. Mas para um chef, fazer um hambúrguer segue o mesmo procedimento geral: prepare o pão, cozinhe o empadão e, em seguida, coloque-o entre os pães superior e inferior.

Um hambúrguer é um exemplo da vida real do uso de padrões de estratégia.

Vamos dar uma olhada no código.

Existem três participantes no padrão de estratégia.

A estratégia declara uma interface comum a todos os algoritmos suportados. O contexto usa essa interface para chamar o algoritmo definido por uma estratégia concreta.

A estratégia concreta implementa o algoritmo usando o StrategyInterface.

O contexto é configurado com um Objeto ConcreteStrategy; mantém uma referência a um objeto de estratégia; pode definir uma interface que permita que a estratégia acesse seus dados.

GrilledChickenStuffing e BeefPattyStuffing são nossas estratégias concretas. Cada um define como seu recheio deve ser cozido. A classe Burger é o nosso contexto. Ele é configurado com uma estratégia concreta e usa a estratégia concreta mais tarde quando um hambúrguer precisa ser cozido.

No nosso exemplo de hambúrguer, não temos uma classe específica que declare qual interface as estratégias concretas devem implementar. Isso é porque não precisamos, graças à digitação do pato de Ruby. Se anda como um pato e fala como um pato, é um pato. Se puder ser cozido como hambúrguer, é um hambúrguer.

Estratégia declara a interface para a qual uma estratégia concreta deve implementar e para qual contexto pode ser usado. Como você pode ver no código acima, GrilledChickenStuffing e BeefPattyStuffing implementam o método cook, e esse é o método que o usuário de uma estratégia concreta, também conhecida como contexto, espera que seja fornecida uma estratégia concreta.

A ideia principal do padrão de estratégia

A chave para o padrão de estratégia é extrair os diferentes algoritmos para um objeto separado. Esses objetos se tornam uma família de algoritmos que o contexto pode escolher. Cada um desses objetos, também conhecido como estratégias, faz o mesmo trabalho e suporta a mesma interface.

No nosso exemplo de hambúrguer, temos estratégias diferentes de hambúrguer. E cada uma das estratégias de hambúrguer de concreto suporta a mesma interface implementando o método cook.

É tudo sobre composição. O usuário tem uma estratégia e delegados. O usuário da estratégia delega o trabalho. No nosso exemplo, um hambúrguer tem uma empada e delega o trabalho de cozinhar.

Vantagens do padrão de estratégia

  • Ele alcança uma melhor separação de preocupações, retirando um conjunto de estratégias de uma classe e revive a classe Burger de qualquer responsabilidade por nosso conhecimento do recheio.
  • Isso facilita a troca de estratégias em tempo de execução, porque o padrão é baseado na composição e delegação, e não na herança.

Pontos a observar ao considerar o uso do padrão de estratégia

  • Passagem de dados entre contexto e estratégia. Se a implementação de uma estratégia concreta exigir dados do contexto, você poderá passar os dados como parâmetros para uma estratégia concreta ou passar o próprio contexto para uma estratégia concreta. Isso é para que a estratégia concreta possa ter acesso aos dados através do contexto. Qualquer que seja a maneira que você escolher, preste atenção no emaranhado do contexto e na estratégia concreta.
  • Verifique se você realmente precisa do padrão de estratégia, do método do modelo ou do padrão do decorador.

Princípios de design usados ​​no padrão de estratégia

  • Encapsular o que varia
  • Favorecer a composição sobre a herança
  • Programa para interfaces, não implementação

Agora você aprendeu sobre o padrão de estratégia.

Aqui está uma pergunta importante: qual é a sua estratégia de hambúrguer favorita? :)

Eu publico semanalmente no sihui.io.

Inscreva-se para não perder o próximo artigo da série.

Da próxima vez, veremos o método do modelo e…