DEV Community

Camila Ferreira
Camila Ferreira

Posted on

1

Padrões de projeto: Strategy

Padrões de projeto, ou design patterns, são soluções bem definidas e testadas para resolver problemas comuns no desenvolvimento de software. Eles promovem boas práticas, facilitando a comunicação e o reaproveitamento de soluções entre desenvolvedores e melhorando a manutenibilidade e a eficiência do código.

O Strategy é um padrão de projeto comportamental, o que significa que ele facilita a comunicação entre objetos e organiza a troca de informações. Com o Strategy, podemos definir uma família de algoritmos, encapsulá-los em classes distintas e torná-los intercambiáveis. Isso torna o padrão ideal quando há várias maneiras de realizar uma tarefa específica, como implementar diferentes formas de pagamento em uma aplicação. Dessa forma, podemos selecionar a estratégia de pagamento sem alterar a estrutura principal da aplicação, respeitando o princípio de aberto/fechado do SOLID e reduzindo o uso de condicionais.

Exemplo prático em Java
No exemplo abaixo, implementamos um sistema de pagamento que permite ao usuário escolher entre cartão de crédito ou PayPal. A classe ShoppingCart aceita diferentes estratégias de pagamento, aplicando o padrão Strategy para simplificar e organizar a lógica.

`public interface PaymentStrategy {
void pay(double amount);
}

public class CreditCardPayment implements PaymentStrategy {
private String cardNumber;
private String cardHolder;

public CreditCardPayment(String cardNumber, String cardHolder) {
    this.cardNumber = cardNumber;
    this.cardHolder = cardHolder;
}

@Override
public void pay(double amount) {
    System.out.println("Pagando " + amount + " com cartão de crédito.");
}
Enter fullscreen mode Exit fullscreen mode

}

public class PayPalPayment implements PaymentStrategy {
private String email;

public PayPalPayment(String email) {
    this.email = email;
}

@Override
public void pay(double amount) {
    System.out.println("Pagando " + amount + " com PayPal.");
}
Enter fullscreen mode Exit fullscreen mode

}

public class ShoppingCart {
private PaymentStrategy paymentStrategy;

public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
    this.paymentStrategy = paymentStrategy;
}


public void checkout(double amount) {
    paymentStrategy.pay(amount);
}
Enter fullscreen mode Exit fullscreen mode

}
`

A interface PaymentStrategy ** define um método de pagamento genérico.
As classes *CreditCardPayment * e **PayPalPayment
implementam essa interface, cada uma encapsulando a lógica de pagamento específica.
A classe ShoppingCart permite definir e trocar a estratégia de pagamento, chamando o método de pagamento da estratégia escolhida.
Esse exemplo ilustra como o padrão Strategy simplifica a adição de novos métodos de pagamento e facilita o entendimento do código, eliminando condicionais e promovendo a reutilização e o princípio de responsabilidade única.
O padrão Strategy é uma poderosa ferramenta para estruturar o código de forma flexível, extensível e fácil de manter. Ele permite adicionar novas estratégias sem alterar o código existente, promovendo a reutilização e facilitando a adaptação do sistema a novos requisitos. No exemplo da aplicação de pagamento, o Strategy simplificou a escolha de métodos de pagamento, organizando as lógicas em classes separadas e deixando o código mais limpo e modular. Esse padrão reduz a necessidade de condicionais, favorece a aplicação dos princípios SOLID e proporciona uma arquitetura que cresce de maneira organizada. Em resumo, o uso do Strategy traz vantagens práticas e contribui para a robustez e escalabilidade do software.

Image of Datadog

Master Mobile Monitoring for iOS Apps

Monitor your app’s health with real-time insights into crash-free rates, start times, and more. Optimize performance and prevent user churn by addressing critical issues like app hangs, and ANRs. Learn how to keep your iOS app running smoothly across all devices by downloading this eBook.

Get The eBook

Top comments (1)

Collapse
 
programmerraja profile image
Boopathi

This is a great explanation of the Strategy pattern! The Java example is very helpful and makes it easy to see how the pattern works in practice. I especially like the point about how it simplifies adding new payment methods without changing existing code.

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs