Maxwell Anabil Macabeu da Silva Bacharelado em Engenharia de Software — UniEvangélica Anápolis —...

Maxwell Anabil Macabeu da Silva Bacharelado em Engenharia de Software — UniEvangélica Anápolis — Goiás — Brasil

Sistemas de e-commerce dependem de integrações com serviços externos, como gateways de pagamento, plataformas de logística e transportadoras. Um problema recorrente aparece quando cada fornecedor disponibiliza uma API diferente, com métodos, formatos de dados e estruturas de resposta incompatíveis com o sistema existente.

Neste artigo apresento a aplicação do Adapter Pattern, um padrão estrutural do catálogo GoF, em um cenário de integração de transportadoras dentro de um sistema de e-commerce desenvolvido em Java.

A proposta é criar uma interface padrão utilizada pelo sistema e implementar adaptadores responsáveis por traduzir a comunicação com diferentes APIs externas. Dessa forma, o sistema principal não precisa conhecer os detalhes específicos de cada transportadora.

Além da explicação do padrão, será apresentado um estudo de caso, um diagrama UML de classes, uma visão de arquitetura, uma implementação em Java e uma análise das vantagens e dos trade-offs envolvidos.

Palavras-chave: Adapter Pattern; Design Patterns; Java; Engenharia de Software; APIs; Integração de Sistemas; E-commerce.

Durante o desenvolvimento de software, alguns problemas aparecem repetidamente em diferentes projetos.

Como organizar a criação de objetos? Como permitir que comportamentos sejam alterados sem modificar várias partes do sistema? Como integrar sistemas que possuem interfaces incompatíveis?

Os Design Patterns, ou padrões de projeto, representam soluções conhecidas e reutilizáveis para problemas recorrentes de design de software.

Eles não são códigos prontos que simplesmente copiamos para o projeto. Na realidade, são maneiras de estruturar classes e responsabilidades para resolver determinados tipos de problema.

Os padrões originalmente apresentados pelo chamado Gang of Four (GoF) são geralmente divididos em três grupos:

O padrão abordado neste artigo é o Adapter Pattern, pertencente à categoria dos padrões estruturais.

Imagine um sistema de e-commerce que possui um módulo responsável por calcular o valor do frete de um pedido.

Inicialmente, a empresa utilizava apenas uma transportadora. O código poderia ser semelhante a:

O problema aparece quando a empresa decide oferecer mais opções de entrega. Uma segunda transportadora pode possuir algo semelhante a:

fastShipClient.getRate( new FastShipPayload( origin, destination, weightInKg ) );

Enter fullscreen mode

Exit fullscreen mode

Observe que as duas APIs não trabalham da mesma maneira.

Uma pode utilizar peso em gramas, parâmetros separados e valor retornado em centavos. Outra pode utilizar peso em quilogramas, um objeto de requisição e valor retornado como BigDecimal.

O sistema começa então a acumular verificações:

Além disso, o ShippingService passa a conhecer detalhes que não deveriam fazer parte de sua responsabilidade, como formato de requisição de cada fornecedor, unidades de medida, nomes de métodos externos, estruturas de resposta e tratamento específico de cada API.

É exatamente nesse tipo de situação que o Adapter Pattern pode ajudar.