Design Pattern Strategy no Java
Tags: designpatterns, programming, java, strategy
Published: 2024-01-11 00:55:35

{% embed https://www.youtube.com/watch?v=i6hi2YGsiXU %}

**_[TRANSCRIÇÃO]_**

Certamente, você já se deparou com um código semelhante a este em algum projeto no qual já trabalhou. 

```
if (channel.equalsIgnoreCase("discord")) {
   // ...
} else if (channel.equalsIgnoreCase("instagram")) {
   // ...
} else if (channel.equalsIgnoreCase("twitter")) {
   // ...
} else if (channel.equalsIgnoreCase("email")) {
   // ...
} else if (channel.equalsIgnoreCase("whatsapp")) {
   // ...
}
```

Este código pode ser aprimorado utilizando o design pattern strategy. No vídeo de hoje, vamos transformar este código nesse outro aqui, aplicando o design pattern strategy. 

```
private final Map<String, NotificationStrategy> mapStrategy = Map.of(
        "discord", new DiscordNotificationStrategy(),
        "instagram", new InstagramNotificationStrategy(),
        "twitter", new TwitterNotificationStrategy(),
        "email", new EmailNotificationStrategy(),
        "whatsapp", new WhatsappNotificationStrategy()
    );
```

Então, vamos ao vídeo! Fala Devs, como vocês estão? Aqui quem fala é Bruno Garcia, criador da Build and Run. No vídeo de hoje, vamos aprender o Design Pattern Strategy na prática.

## Apresentação do Problema a ser Resolvido:

Se você está interessado em aprender este design pattern, provavelmente já visitou o site RefactoringGuru. Este site fornece informações sobre o propósito de uso, o problema que ele visa resolver e a solução recomendada. No entanto, pode não ficar claro como realmente aplicar esse design pattern. No vídeo de hoje, vou mostrar como eu o implemento em meus projetos pessoais e profissionais. Veremos como isso pode melhorar significativamente o nosso código.

Para o vídeo de hoje, tenho uma aplicação simples, basicamente uma aplicação de notificações. A ideia é poder enviar notificações para vários canais, recebendo uma requisição com o canal, o destino e a mensagem da notificação. Por exemplo, se eu quiser enviar uma notificação para o Instagram, eu indicaria o canal como Instagram, o destino como um usuário e a mensagem da notificação. 

A aplicação deveria ser agnóstica, permitindo enviar notificações para diferentes canais, como Discord ou WhatsApp. O código foi intencionalmente implementado com uma sequência de if-elses, e hoje vamos aplicar o design pattern strategy para melhorá-lo.

## Sinais para a Utilização do Design Pattern Strategy:

Para saber se o design pattern strategy é apropriado, observe se há várias condicionais e se o resultado varia dependendo de cada condição. Por exemplo, ao processar diferentes tipos de pagamentos, a implementação varia, mas o propósito final é o mesmo. No nosso caso, o propósito é enviar uma notificação, mas a forma varia de acordo com a implementação. Quando você identificar esse padrão, pode aplicar o design pattern strategy para simplificar o código.

## Implementando as Estratégias:

A primeira etapa é identificar o problema, criar uma interface chamada NotificationStrategy, e em seguida, implementar diferentes estratégias para cada canal (por exemplo, Discord, Instagram, Email, WhatsApp).

## Realizando a Amarração das Estratégias:

Em seguida, realizamos a amarração das estratégias usando um mapa (chave-valor) para associar cada canal à sua estratégia correspondente. Isso elimina a necessidade de uma sequência de if-elses.

## Testando o Design Pattern Strategy:

Ao testar a aplicação, podemos observar como o código escolhe dinamicamente a estratégia correta com base no canal fornecido.

## Vantagens do Design Pattern Strategy:

As vantagens incluem a abertura do código para extensão, permitindo a adição fácil de novas estratégias. Além disso, facilita a realização de testes unitários específicos para cada estratégia.

## Conclusão:

Essa é a maneira como eu entendo e aplico o design pattern strategy na prática. Existem diferentes abordagens, mas esta funciona bem para os casos de uso mencionados. Se você gostou deste estilo de vídeo, compartilhe suas sugestões para os próximos temas. Deixe seu like, inscreva-se no canal e siga-nos nas redes sociais. Até a próxima!