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 sortEstraté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
- Padrão Observer: Notificação de Eventos
- Padrão Strategy: Algoritmos Intercambiáveis
- Padrão Command: Encapsulamento de Ações
- Template Method: Definição de Esqueletos de Algoritmos