Padrões de Projeto em Java: exemplos avançados e implementação

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Padrões Avançados de Design em Java: da Teoria a Exemplos Complexos



Padrões de design são soluções comprovadas para problemas típicos que surgem no desenvolvimento de software. Se os padrões básicos (Singleton, Factory, Observer) são familiares à maioria dos desenvolvedores Java, os padrões avançados exigem uma compreensão profunda da arquitetura e a capacidade de aplicá-los em cenários de negócios complexos. Neste artigo, analisaremos três padrões poderosos: Visitor, Command e State — com exemplos reais em Java que o ajudarão a escrever código mais flexível e sustentável.



1. Padrão Visitor: Separando Algoritmos da Estrutura de Dados



Propósito: Permite adicionar novas operações para objetos de diferentes classes sem modificar as próprias classes. Ideal para trabalhar com hierarquias complexas onde diferentes ações precisam ser executadas dependendo do tipo de objeto.



Problema: Imagine um sistema de gerenciamento de documentos com classes TextDocument, ImageDocument e SpreadsheetDocument. Você precisa implementar exportação para PDF, HTML e TXT. Sem o Visitor, cada novo formato de exportação exigiria alterações em todas as classes de documentos.



Solução com Visitor:



// 1. Interface do elemento (documento)interface DocumentElement {    void accept(DocumentVisitor visitor);}

// 2. Elementos concretosclass TextDocument implements DocumentElement { private String content; public TextDocument(String content) { this.content = content; } public String getContent() { return content; } @Override public void accept(DocumentVisitor visitor) { visitor.visit(this); }}

class ImageDocument implements DocumentElement { private byte[] imageData; public ImageDocument(byte[] data) { this.imageData = data; } public byte[] getImageData() { return imageData; } @Override public void accept(DocumentVisitor visitor) { visitor.visit(this); }}

// 3. Interface do visitanteinterface DocumentVisitor { void visit(TextDocument doc); void visit(ImageDocument doc); void visit(SpreadsheetDocument doc);}

// 4. Visitante concreto — exportação para HTMLclass HtmlExporter implements DocumentVisitor { private StringBuilder sb = new StringBuilder(); @Override public void visit(TextDocument doc) { sb.append("<html><body><p>") .append(doc.getContent()) .append("</p></body></html>"); } @Override public void visit(ImageDocument doc) { sb.append("<html><body><img src='data:image/png;base64,") .append(Base64.getEncoder().encodeToString(doc.getImageData())) .append("'/></body></html>"); } @Override public void visit(SpreadsheetDocument doc) { sb.append("<html><body><table>...</table></body></html>"); } public String getResult() { return sb.toString(); }}

// 5. Código clientepublic class DocumentSystem { public static void main(String[] args) { List<DocumentElement> documents = Arrays.asList( new TextDocument("Hello World"), new ImageDocument(new byte[]{1,2,3}) ); HtmlExporter exporter = new HtmlExporter(); for (DocumentElement doc : documents) { doc.accept(exporter); } System.out.println(exporter.getResult()); }}


Vantagem chave: Para adicionar um novo formato (por exemplo, JSON), basta criar uma nova classe JsonExporter implements DocumentVisitor — nenhuma das classes de documento é alterada.



2. Padrão Command: e

Blogs

Book Recommendations