0Pricing
Java Academy · Aula

Padrão Strategy: Algoritmos Intercambiáveis

Encapsule algoritmos de ordenação ou pagamento por trás de uma interface Strategy para alterná-los em tempo de execução.

Padrão Strategy: Algoritmos Intercambiáveis é uma aula grátis de Java Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Java Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Java Academy inclui 4 aulas no total.

A intenção da Estratégia

Estratégia define uma família de algoritmos, encapsula cada um deles e os torna intercambiáveis. Ela permite que o algoritmo varie independentemente do contexto que o utiliza.

O problema sem Estratégia

Sem a Estratégia, a seleção do algoritmo fica escondida em cadeias de if-else. Adicionar um novo algoritmo significa editar a classe de contexto, violando o Princípio Aberto/Fechado.

public double sort(List<Integer> data, String method) {
    if (method.equals("bubble")) { /* bubble sort */ }
    else if (method.equals("merge")) { /* merge sort */ }
    // adding quicksort requires editing this class
}

Interface da Estratégia

Defina uma @FunctionalInterface ou uma interface comum que represente o contrato do algoritmo. Cada implementação encapsula um algoritmo diferente.

public interface SortStrategy {
    void sort(List<Integer> data);
}
public class BubbleSortStrategy implements SortStrategy {
    public void sort(List<Integer> data) { /* bubble sort logic */ }
}
public class QuickSortStrategy implements SortStrategy {
    public void sort(List<Integer> data) { Collections.sort(data); }
}

Classe de contexto

O contexto mantém uma referência a uma estratégia e delega a execução do algoritmo a ela. A estratégia pode ser substituída em tempo de execução.

public class Sorter {
    private SortStrategy strategy;
    public Sorter(SortStrategy strategy) { this.strategy = strategy; }
    public void setStrategy(SortStrategy s) { this.strategy = s; }
    public void sort(List<Integer> data)   { strategy.sort(data); }
}

Alternando estratégias em tempo de execução

Altere a estratégia dinamicamente sem modificar o contexto. Isso torna o comportamento configurável de fora da classe.

Sorter sorter = new Sorter(new BubbleSortStrategy());
sorter.sort(data);                          // uses bubble sort
sorter.setStrategy(new QuickSortStrategy());
sorter.sort(data);                          // now uses quick sort

Estratégias com lambda

Quando a interface da estratégia é uma @FunctionalInterface, utilize expressões lambda diretamente — não são necessárias classes explícitas para estratégias simples.

Sorter sorter = new Sorter(data -> Collections.sort(data)); // lambda strategy
// or method reference:
Sorter sorter2 = new Sorter(Collections::sort);

Estratégia para processamento de pagamentos

Uso clássico no mundo real: um contexto de pagamento aceita diferentes estratégias de pagamento (cartão de crédito, PayPal, criptomoedas) sem conhecer os detalhes de cada uma.

public interface PaymentStrategy {
    void pay(double amount);
}
new PaymentProcessor(new CreditCardStrategy("4111...")).pay(99.99);
new PaymentProcessor(new PayPalStrategy("user@email.com")).pay(99.99);

Estratégia para compressão

Um processador de arquivos pode utilizar uma CompressionStrategy. Conecte GZIP, ZIP ou LZ4 sem alterar o fluxo de processamento de arquivos.

public interface CompressionStrategy {
    byte[] compress(byte[] data) throws IOException;
}
public class GzipStrategy implements CompressionStrategy {
    public byte[] compress(byte[] data) throws IOException { /* gzip */ return new byte[0]; }
}

Combinando Estratégia com Fábrica

Utilize uma fábrica para selecionar a estratégia com base na configuração, mantendo a lógica de seleção separada tanto do contexto quanto das próprias estratégias.

SortStrategy strategy = switch (config.getSortMethod()) {
    case "bubble" -> new BubbleSortStrategy();
    case "merge"  -> new MergeSortStrategy();
    default       -> Collections::sort;
};
new Sorter(strategy).sort(data);

Estratégia versus Método de Modelo

O Método de Modelo utiliza herança: a estrutura básica fica na classe base; as subclasses sobrescrevem as etapas. A Estratégia utiliza composição: o algoritmo é totalmente externo. Prefira a Estratégia para obter maior flexibilidade.

Estratégia no JDK

Comparator é a Estratégia canônica do JDK. Passe diferentes comparadores para Collections.sort a fim de alterar o algoritmo de ordenação sem modificar o código da coleção.

List<String> names = List.of("Bob", "Alice", "Charlie");
names.stream().sorted(Comparator.comparingInt(String::length)).forEach(System.out::println);

Estratégias de teste

As estratégias são fáceis de testar isoladamente — basta chamar strategy.sort(data) em um teste unitário. Injete estratégias simuladas no contexto para testar a lógica de orquestração do contexto.

Verificação rápida

Qual é a principal diferença estrutural entre Estratégia e Método-Modelo?

Recapitulação

A Estratégia encapsula algoritmos intercambiáveis por trás de uma interface comum. Use lambdas para estratégias simples e classes para as complexas. Combine-as com fábricas para uma seleção orientada por configuração.

Perguntas Frequentes

A aula “Padrão Strategy: Algoritmos Intercambiáveis” é grátis?

Sim — o texto completo de “Padrão Strategy: Algoritmos Intercambiáveis” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Java Academy, atualize para CoddyKit PRO. O curso de Java Academy inclui 4 aulas no total.

O que vou aprender em “Padrão Strategy: Algoritmos Intercambiáveis”?

Encapsule algoritmos de ordenação ou pagamento por trás de uma interface Strategy para alterná-los em tempo de execução. Você pratica Java Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Java Academy?

Nenhuma experiência prévia é necessária. Java Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Padrão Strategy: Algoritmos Intercambiáveis”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Java Academy?

Sim. Cada aula de Java Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Padrão Observer: Notificação de Eventos
  2. Padrão Strategy: Algoritmos Intercambiáveis
  3. Padrão Command: Encapsulamento de Ações
  4. Template Method: Definição de Esqueletos de Algoritmos
← Voltar para Java Academy