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.

Heroku

This site is built on Heroku

Join the ranks of developers at Salesforce, Airbase, DEV, and more who deploy their mission critical applications on Heroku. Sign up today and launch your first app!

Get Started

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.

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay