<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Bruno</title>
    <description>The latest articles on DEV Community by Bruno (@stv4ns).</description>
    <link>https://dev.to/stv4ns</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3061110%2Fbfe4b712-8b70-4af2-89dc-24c22ce93b30.jpeg</url>
      <title>DEV Community: Bruno</title>
      <link>https://dev.to/stv4ns</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/stv4ns"/>
    <language>en</language>
    <item>
      <title>Spring Boot Actuator</title>
      <dc:creator>Bruno</dc:creator>
      <pubDate>Tue, 21 Apr 2026 06:11:57 +0000</pubDate>
      <link>https://dev.to/stv4ns/spring-boot-actuator-4n9b</link>
      <guid>https://dev.to/stv4ns/spring-boot-actuator-4n9b</guid>
      <description>&lt;h2&gt;
  
  
  O que é o Spring Boot Actuator?
&lt;/h2&gt;

&lt;p&gt;O Spring Boot Actuator é um módulo do Spring Boot que fornece funcionalidades prontas para monitoramento, gerenciamento e observabilidade de aplicações em tempo de execução.&lt;/p&gt;

&lt;p&gt;Ele expõe endpoints HTTP que permitem inspecionar o estado interno da aplicação sem precisar modificar o código ou reiniciar o sistema.&lt;/p&gt;

&lt;p&gt;Endpoints Principais&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Método&lt;/th&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Descrição&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/actuator/health&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Status da aplicação e sub-componentes (DB, Redis, disco...)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/actuator/metrics&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Lista todas as métricas disponíveis (JVM, HTTP, CPU...)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/actuator/info&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Informações da aplicação (versão, build, git commit...)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/actuator/env&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Variáveis de ambiente e propriedades de configuração&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/actuator/beans&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Todos os beans Spring registrados no contexto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/actuator/mappings&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Todos os mapeamentos de rotas HTTP (@RequestMapping)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/actuator/loggers&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nível de log de cada logger da aplicação&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/actuator/loggers/{name}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Altera nível de log em tempo real (sem restart!)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/actuator/threaddump&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Thread dump completo da JVM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/actuator/prometheus&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Métricas no formato Prometheus (requer Micrometer)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Por padrão&lt;/strong&gt;, apenas &lt;code&gt;/health&lt;/code&gt; e &lt;code&gt;/info&lt;/code&gt; são expostos via HTTP.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Configuração (&lt;code&gt;application.properties&lt;/code&gt; / &lt;code&gt;application.yml&lt;/code&gt;)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Expor todos os endpoints
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;management.endpoints.web.exposure.include&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;
&lt;span class="py"&gt;management.endpoint.health.show-details&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;always&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Expor apenas endpoints específicos
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;management.endpoints.web.exposure.include&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;health,info,metrics&lt;/span&gt;
&lt;span class="py"&gt;management.endpoints.web.exposure.exclude&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;env,beans&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Mudar a porta e o base path
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;management.server.port&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;8081&lt;/span&gt;
&lt;span class="py"&gt;management.endpoints.web.base-path&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/manage&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;









&lt;h2&gt;
  
  
  Customização
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Health Indicator customizado
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Component&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MinhaIntegracaoHealth&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;HealthIndicator&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Health&lt;/span&gt; &lt;span class="nf"&gt;health&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;verificarIntegracao&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt;
            &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="nc"&gt;Health&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;up&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;withDetail&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"api"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"online"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Health&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;down&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;withDetail&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"erro"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"timeout"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  O Actuator serve para:
&lt;/h3&gt;

&lt;p&gt;Monitorar a saúde da aplicação&lt;br&gt;
Expor métricas de desempenho&lt;br&gt;
Diagnosticar problemas em produção&lt;br&gt;
Integrar com ferramentas de observabilidade&lt;br&gt;
Gerenciar comportamento da aplicação em runtime&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Health Check
Endpoint:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;/actuator/health&lt;br&gt;
Permite verificar se a aplicação está funcionando corretamente.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Métricas (Micrometer)
Endpoint:
/actuator/metrics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fornece dados como:&lt;br&gt;
Tempo de resposta&lt;br&gt;
Uso de memória&lt;br&gt;
Número de requisições&lt;br&gt;
Taxa de erro&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Logs dinâmicos
Endpoint:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;/actuator/loggers&lt;br&gt;
Permite alterar o nível de log sem reiniciar a aplicação.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Informações da aplicação
Endpoint:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;/actuator/info&lt;br&gt;
Exibe informações como versão, nome e build.&lt;/p&gt;

&lt;h1&gt;
  
  
  ATENÇÃO
&lt;/h1&gt;

&lt;p&gt;** Deve ser protegido em produção.**&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ambiente e configurações
Endpoint:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;/actuator/env&lt;br&gt;
Mostra propriedades e variáveis de ambiente.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Beans do Spring
Endpoint:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;/actuator/beans&lt;br&gt;
Lista todos os componentes carregados pelo Spring.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Integração com Prometheus
Endpoint:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;/actuator/prometheus&lt;br&gt;
Permite exportar métricas para ferramentas como Prometheus e Grafana.&lt;/p&gt;




&lt;h2&gt;
  
  
  O que o Actuator resolve?
&lt;/h2&gt;

&lt;p&gt;Sem o Actuator:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dificuldade para monitorar aplicação&lt;/li&gt;
&lt;li&gt;Debug complicado em produção&lt;/li&gt;
&lt;li&gt;Falta de visibilidade sobre performance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com o Actuator:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Observabilidade centralizada&lt;/li&gt;
&lt;li&gt;Diagnóstico rápido&lt;/li&gt;
&lt;li&gt;Monitoramento contínuo&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Use o Actuator quando:
&lt;/h2&gt;

&lt;p&gt;Ele transforma sua aplicação em um sistema observável, permitindo:&lt;/p&gt;

&lt;p&gt;Monitorar saúde&lt;br&gt;
Acompanhar métricas&lt;br&gt;
Diagnosticar problemas&lt;br&gt;
Integrar com ecossistemas de cloud&lt;br&gt;
Dominar o Actuator significa dar um passo importante para trabalhar com sistemas distribuídos, microserviços e ambientes de produção reais.&lt;/p&gt;

</description>
      <category>backend</category>
      <category>java</category>
      <category>monitoring</category>
      <category>springboot</category>
    </item>
    <item>
      <title>#4 Docker - Volumes</title>
      <dc:creator>Bruno</dc:creator>
      <pubDate>Sat, 14 Mar 2026 17:28:28 +0000</pubDate>
      <link>https://dev.to/stv4ns/4-docker-volumes-dim</link>
      <guid>https://dev.to/stv4ns/4-docker-volumes-dim</guid>
      <description>&lt;h1&gt;
  
  
  Docker Volumes
&lt;/h1&gt;

&lt;p&gt;Volumes são mecanismos utilizados pelo Docker para &lt;strong&gt;persistir dados&lt;br&gt;
fora do ciclo de vida dos containers&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Por padrão, containers são &lt;strong&gt;efêmeros&lt;/strong&gt;, ou seja, quando um container é&lt;br&gt;
removido, os dados armazenados dentro dele também são perdidos. Volumes&lt;br&gt;
permitem que os dados sejam armazenados &lt;strong&gt;no host&lt;/strong&gt;, garantindo&lt;br&gt;
persistência.&lt;/p&gt;




&lt;h2&gt;
  
  
  Características dos Volumes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Persistem dados mesmo após o container ser removido&lt;/li&gt;
&lt;li&gt;  Podem ser compartilhados entre múltiplos containers&lt;/li&gt;
&lt;li&gt;  São gerenciados pelo Docker&lt;/li&gt;
&lt;li&gt;  Ficam armazenados no host&lt;/li&gt;
&lt;li&gt;  Local padrão no Linux:  /var/lib/docker/volumes&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Criando um Volume
&lt;/h2&gt;

&lt;p&gt;Criar volume:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker volume create meu-volume
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Listar volumes:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker volume ls
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Inspecionar volume:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker volume inspect meu-volume
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Remover volume:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker volume rm meu-volume
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;h2&gt;
  
  
  Utilizando Volume em um Container
&lt;/h2&gt;

&lt;p&gt;Exemplo com nginx:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -d \
--name nginx-container \
-v meu-volume:/usr/share/nginx/html \
nginx:1.27-alpine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Estrutura:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Host
 │
 └─ Volume (meu-volume)
      │
      └─ Container nginx
           └─ /usr/share/nginx/html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Tipos de Persistência:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Volume (gerenciado pelo Docker)&lt;/p&gt;

&lt;p&gt;-v meu-volume:/data&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bind Mount (diretório do host)&lt;/p&gt;

&lt;p&gt;-v ./dados:/data&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Compartilhando Volume entre Containers
&lt;/h2&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -d --name container1 -v shared-volume:/app nginx
docker run -d --name container2 -v shared-volume:/app nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Ambos os containers acessam os mesmos dados.&lt;/p&gt;




&lt;h2&gt;
  
  
  Resumo
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Conceito&lt;/th&gt;
&lt;th&gt;Descrição&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Volume&lt;/td&gt;
&lt;td&gt;Persistência de dados no Docker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Container&lt;/td&gt;
&lt;td&gt;Ambiente efêmero&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bind Mount&lt;/td&gt;
&lt;td&gt;Pasta do host montada dentro do container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compartilhamento&lt;/td&gt;
&lt;td&gt;Volumes podem ser utilizados por vários containers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>beginners</category>
      <category>devops</category>
      <category>docker</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>#3 Docker - Network</title>
      <dc:creator>Bruno</dc:creator>
      <pubDate>Sat, 14 Mar 2026 17:19:55 +0000</pubDate>
      <link>https://dev.to/stv4ns/-3-docker-network-2eff</link>
      <guid>https://dev.to/stv4ns/-3-docker-network-2eff</guid>
      <description>&lt;h2&gt;Comunicação entre Containers&lt;/h2&gt;

&lt;p&gt;Por padrão, containers Docker são isolados. Para que eles consigam se comunicar entre si, é necessário conectá-los a uma mesma rede Docker.&lt;/p&gt;

&lt;p&gt;Docker cria automaticamente uma rede chamada bridge, mas também é possível criar redes customizadas, que oferecem melhor isolamento e resolução de nomes entre containers.&lt;/p&gt;




&lt;h2&gt;Tipos de rede&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Bridge (padrão), rede padrão usada para comunicação entre containers no mesmo host.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Host, container usa diretamente a rede do host.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Overlay, rede usada em clusters para comunicação entre múltiplos hosts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Macvlan, permite que containers recebam IP próprio na rede física.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;Comandos&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;criando - docker network create --driver bridge minha-rede&lt;br&gt;
listando - docker network ls&lt;br&gt;
inspecionando - docker network inspect minha-rede&lt;br&gt;
conectando - docker network connect minha-rede container_existente&lt;br&gt;
removendo - docker network rm minha-rede&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>devops</category>
      <category>docker</category>
      <category>networking</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>#2 Docker - Cotainers</title>
      <dc:creator>Bruno</dc:creator>
      <pubDate>Sat, 14 Mar 2026 17:10:12 +0000</pubDate>
      <link>https://dev.to/stv4ns/2-docker-cotainers-4dae</link>
      <guid>https://dev.to/stv4ns/2-docker-cotainers-4dae</guid>
      <description>&lt;p&gt;Um container é uma instância em execução de uma imagem.&lt;/p&gt;

&lt;p&gt;Quando uma imagem é executada usando Docker, o Docker cria um container isolado onde a aplicação roda, uma mesma imagem pode gerar múltiplos containers simultaneamente.&lt;/p&gt;

&lt;p&gt;Containers são ambientes isolados que não armazenam estado por padrão. Eles executam de forma independente do sistema operacional host e não possuem comunicação nativa direta com outros containers ou com o host sem configuração de rede explícita. Além disso, containers são efêmeros: quando o processo principal termina, o container é encerrado e qualquer estado interno pode ser perdido caso não haja mecanismos de persistência, como volumes.&lt;/p&gt;

&lt;h2&gt;Características importantes dos containers&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Containers executam um processo principal (PID 1)&lt;/li&gt;
&lt;li&gt;Compartilham o kernel do sistema operacional host&lt;/li&gt;
&lt;li&gt;São efêmeros e descartáveis&lt;/li&gt;
&lt;li&gt;Utilizam sistemas de arquivos em camadas&lt;/li&gt;
&lt;li&gt;Possuem isolamento de recursos via namespaces e cgroups&lt;/li&gt;
&lt;li&gt;Podem se comunicar através de redes Docker&lt;/li&gt;
&lt;li&gt;Dados persistentes devem ser armazenados em volumes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Relação entre imagem e container&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Imagem&lt;br&gt;
  ↓ executando - Docker run&lt;br&gt;
Container &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;Comandos Comuns&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run → cria e inicia container
docker stop → para container
docker start → inicia container novamente
docker &lt;span class="nb"&gt;rm&lt;/span&gt; → remove container

docker run &lt;span class="o"&gt;[&lt;/span&gt;OPTIONS] IMAGE[:TAG|@DIGEST] &lt;span class="o"&gt;[&lt;/span&gt;COMMAND]
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:80 &lt;span class="nt"&gt;--name&lt;/span&gt; meu-nginx nginx:1.27-alpine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>beginners</category>
      <category>devops</category>
      <category>docker</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>#1 Docker - Imagens</title>
      <dc:creator>Bruno</dc:creator>
      <pubDate>Sun, 08 Mar 2026 16:20:29 +0000</pubDate>
      <link>https://dev.to/stv4ns/docker-imagens-30b</link>
      <guid>https://dev.to/stv4ns/docker-imagens-30b</guid>
      <description>&lt;h2&gt;Imagens&lt;/h2&gt;

&lt;p&gt;As imagens são &lt;strong&gt;pacotes imutáveis&lt;/strong&gt; de um projeto/aplicação disponiveis para execução.&lt;/p&gt;

&lt;p&gt;Por exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Postgres&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Prometheus&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rabbit&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As imagens funcionam como um &lt;strong&gt;template ou blueprint&lt;/strong&gt; para criar containers.&lt;/p&gt;

&lt;h3&gt;Características das imagens&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Imutáveis → não são alteradas após criadas&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Versionadas através de tags&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reutilizáveis&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Armazenadas em registries (Docker Hub, ECR, ACR, etc.) ou local no host&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;Containers&lt;/h2&gt;

&lt;p&gt;Os containers são instancias dessas imagens em execução ou seja apos executar uma imagem ela automaticamente vira um container.&lt;/p&gt;

&lt;p&gt;Quando uma imagem é executada usando Docker, o Docker cria um container &lt;strong&gt;isolado&lt;/strong&gt; onde a aplicação roda, esse container não conhece o seu host e você pode ter a mesma imagem rodando X vezes no meu host em container separados.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>devops</category>
      <category>docker</category>
      <category>learning</category>
    </item>
    <item>
      <title>Replicação &amp; Sharding</title>
      <dc:creator>Bruno</dc:creator>
      <pubDate>Sat, 14 Jun 2025 17:48:43 +0000</pubDate>
      <link>https://dev.to/stv4ns/replicacao-sharding-4lbf</link>
      <guid>https://dev.to/stv4ns/replicacao-sharding-4lbf</guid>
      <description>&lt;h1&gt;
  
  
  📘 Replicação e Sharding: Conceitos, Diferenças e Vantagens
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. Introdução
&lt;/h2&gt;

&lt;p&gt;Sistemas de banco de dados distribuídos muitas vezes precisam lidar com grandes volumes de dados, alta disponibilidade e tolerância a falhas. Para atender essas demandas, duas técnicas fundamentais são amplamente utilizadas: &lt;strong&gt;replicação&lt;/strong&gt; e &lt;strong&gt;sharding&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. O que é Replicação?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Replicação&lt;/strong&gt; é o processo de copiar e manter os mesmos dados em múltiplos servidores &lt;/p&gt;

&lt;h3&gt;
  
  
  🔧 Como funciona:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Um servidor principal aceita operações de escrita.&lt;/li&gt;
&lt;li&gt;Um ou mais servidores secundários &lt;strong&gt;Replicas&lt;/strong&gt; mantêm cópias sincronizadas dos dados.&lt;/li&gt;
&lt;li&gt;As réplicas geralmente são atualizadas de forma assíncrona ou semissíncrona.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ Vantagens:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Alta disponibilidade&lt;/strong&gt;: se o servidor principal falhar, uma réplica pode assumir seu papel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Melhor desempenho de leitura&lt;/strong&gt;: consultas podem ser distribuídas entre os nós.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backups mais seguros&lt;/strong&gt;: réplicas podem ser usadas para realizar backups sem impactar o sistema principal.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. O que é Sharding?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Sharding&lt;/strong&gt; é o processo de dividir os dados em partes menores chamadas (Região, tipo ou por hashing) de &lt;strong&gt;"shards"&lt;/strong&gt;, que são armazenadas em diferentes servidores.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔧 Como funciona:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Cada shard contém uma fração dos dados, baseada em uma chave (ex: ID do cliente).&lt;/li&gt;
&lt;li&gt;Cada servidor armazena apenas uma parte dos dados totais.&lt;/li&gt;
&lt;li&gt;Consultas são roteadas ao shard correto com base nessa chave.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ Vantagens:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Escalabilidade horizontal&lt;/strong&gt;: mais servidores podem ser adicionados conforme o volume de dados cresce.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Melhor desempenho de escrita e leitura&lt;/strong&gt;: reduz a sobrecarga em cada servidor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capacidade de armazenamento distribuída&lt;/strong&gt;: dados grandes são particionados entre servidores.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Pode-se usar os dois juntos?
&lt;/h2&gt;

&lt;p&gt;Sim! Em sistemas grandes, é comum combinar &lt;strong&gt;sharding + replicação&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cada shard pode ter suas próprias réplicas.&lt;/li&gt;
&lt;li&gt;Isso oferece escalabilidade &lt;strong&gt;e&lt;/strong&gt; alta disponibilidade ao mesmo tempo.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. Conclusão
&lt;/h2&gt;

&lt;p&gt;Tanto &lt;strong&gt;replicação&lt;/strong&gt; quanto &lt;strong&gt;sharding&lt;/strong&gt; são técnicas essenciais no design de sistemas distribuídos modernos.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;replicação&lt;/strong&gt; se seu foco for &lt;strong&gt;tolerância a falhas e desempenho de leitura&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;sharding&lt;/strong&gt; se seu foco for &lt;strong&gt;escalabilidade e desempenho com grandes volumes de dados&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A escolha correta depende das necessidades específicas da aplicação e da infraestrutura disponível.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>SAGA</title>
      <dc:creator>Bruno</dc:creator>
      <pubDate>Sun, 01 Jun 2025 13:05:42 +0000</pubDate>
      <link>https://dev.to/stv4ns/saga-5hig</link>
      <guid>https://dev.to/stv4ns/saga-5hig</guid>
      <description>&lt;h2&gt;
  
  
  O que é?
&lt;/h2&gt;

&lt;p&gt;O padrão de projeto SAGA é um padrão arquitetural usado principalmente para gerenciar transações distribuídas em sistemas de microsserviços. Ele foi criado para resolver o problema de coerência de dados em ambientes onde não é possível ou desejável usar uma transação distribuída tradicional (como uma transação ACID que envolve múltiplos bancos de dados ou serviços).&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é uma "transação distribuída"?
&lt;/h2&gt;

&lt;p&gt;É uma operação que envolve múltiplos serviços ou múltiplas bases de dados, onde todos precisam ser consistentes no final. O desafio é: se algo falhar no meio, como desfazer o que já foi feito? &lt;/p&gt;

&lt;p&gt;Uma SAGA é uma sequência de transações locais em diferentes serviços, onde cada transação é seguida por uma ação compensatória (rollback local) caso algo dê errado.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔧 Como funciona?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Existem dois tipos principais de implementação do padrão SAGA:
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Orquestrado
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Existe um orquestrador central que comanda o fluxo de transações.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ele chama cada serviço na ordem correta e, em caso de falha, executa as transações compensatórias.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mais facil de adicionar um fluxo novo&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mais facil de dar manutenção&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Leitura de codógio mais facil&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Coreografado
&lt;/h3&gt;

&lt;p&gt;No padrão coreografado, não existe um orquestrador central. Cada serviço é responsável por ouvir eventos e executar sua parte da transação de forma autônoma. O fluxo é determinado pelos eventos que os serviços emitem e consomem.&lt;/p&gt;

&lt;p&gt;Quando um serviço completa sua tarefa, ele publica um evento (por exemplo, EstoqueReservado), e o próximo serviço no fluxo ouve esse evento e age (por exemplo, o serviço de pagamento escuta e processa o pagamento).&lt;/p&gt;

&lt;p&gt;Se algo falhar no meio do processo, os serviços devem emitir eventos de compensação, permitindo que os serviços anteriores façam o "rollback" por meio de suas ações compensatórias, normalmente seguindo a ordem inversa da execução.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧰 Ferramentas para Design e Execução
&lt;/h2&gt;

&lt;p&gt;Existem ferramentas que ajudam tanto no design visual quanto na execução real dos fluxos do padrão Saga. Uma das mais conhecidas é o:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Camunda: plataforma de automação de processos baseada em BPMN (Business Process Model and Notation).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Permite modelar visualmente o fluxo da saga.&lt;/li&gt;
&lt;li&gt;Pode ser integrada diretamente ao código para controlar os serviços 
e eventos.&lt;/li&gt;
&lt;li&gt;Suporta tanto orquestração quanto coreografia, dependendo da 
arquitetura adotada.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Outras ferramentas que também podem ser usadas para coreografia de eventos incluem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Apache Kafka (com Event-Driven Architecture)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Axon Framework (em Java)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Temporal.io (workflow orchestration, mas pode ser usado de forma &lt;br&gt;
híbrida)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Clean Architecture</title>
      <dc:creator>Bruno</dc:creator>
      <pubDate>Sun, 11 May 2025 22:46:51 +0000</pubDate>
      <link>https://dev.to/stv4ns/clean-architecture-44kl</link>
      <guid>https://dev.to/stv4ns/clean-architecture-44kl</guid>
      <description>&lt;h2&gt;
  
  
  🧱 O que é a Clean Architecture?
&lt;/h2&gt;

&lt;p&gt;A Clean Architecture, proposta por Uncle Bob (Robert C. Martin), é um modelo de arquitetura em camadas que tem como objetivo principal manter o núcleo do sistema isolado de frameworks, bibliotecas e tecnologias externas.&lt;/p&gt;

&lt;p&gt;O foco está em garantir que as regras de negócio fiquem desacopladas, facilitando testes, manutenção e troca de tecnologias ao longo do tempo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3nqpm8fcx0ibf1b543iz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3nqpm8fcx0ibf1b543iz.png" alt="Onion" width="572" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🌐 Camadas explicadas (de fora para dentro):
&lt;/h2&gt;

&lt;p&gt;Nenhuma camada de dentro deve conhecer a camada para fora dela&lt;/p&gt;

&lt;p&gt;-&amp;gt; = Conhece&lt;/p&gt;

&lt;p&gt;lemos sempre azul -&amp;gt; verde -&amp;gt; amarela -&amp;gt; vermelha&lt;/p&gt;

&lt;p&gt;🔵 Camada externa (azul):&lt;br&gt;
Contém frameworks, bancos de dados, bibliotecas de terceiros, servidores web e qualquer tecnologia externa. Ela depende das camadas internas, mas não é dependida por elas.&lt;/p&gt;

&lt;p&gt;🟢 Camada intermediária (verde):&lt;br&gt;
Abriga os adapters, como controllers, presenters e gateways. Essa camada é responsável por traduzir dados entre o mundo externo e o core do sistema.&lt;/p&gt;

&lt;p&gt;🟡 Casos de Uso:&lt;br&gt;
Aqui ficam os use cases, que coordenam regras de negócio e orquestram chamadas para interfaces. Eles usam interfaces para se comunicar com a camada externa (ex: persistência, envio de e-mail).&lt;/p&gt;

&lt;p&gt;🔴 Entidades (Domínio):&lt;br&gt;
O núcleo do sistema. Essa camada contém as regras de negócio puras, como validações e cálculos que não dependem de nada externo.&lt;br&gt;
Exemplo: uma validação de CPF ou o cálculo do total de um pedido.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✅ Vantagens
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Alta testabilidade (core não depende de infra)&lt;/li&gt;
&lt;li&gt;Facilidade de manutenção e evolução&lt;/li&gt;
&lt;li&gt;Baixo acoplamento&lt;/li&gt;
&lt;li&gt;Independência de frameworks e bancos&lt;/li&gt;
&lt;li&gt;Reutilização de lógica de negócio&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ⚠️ Desvantagens
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Curva de aprendizado mais alta&lt;/li&gt;
&lt;li&gt;Mais código e estrutura para coisas simples&lt;/li&gt;
&lt;li&gt;Pode parecer overkill para projetos pequenos&lt;/li&gt;
&lt;li&gt;Demanda disciplina para manter separação clara de camadas&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>#7 DP: Observer</title>
      <dc:creator>Bruno</dc:creator>
      <pubDate>Wed, 07 May 2025 17:03:10 +0000</pubDate>
      <link>https://dev.to/stv4ns/7-dp-observer-27en</link>
      <guid>https://dev.to/stv4ns/7-dp-observer-27en</guid>
      <description>&lt;h2&gt;
  
  
  O que é o Padrão Observer?
&lt;/h2&gt;

&lt;p&gt;O Observer é um padrão de projeto comportamental que define uma relação de dependência entre objetos, onde um objeto (o sujeito) notifica automaticamente outros objetos (os observadores) sempre que seu estado muda. Ele é muito útil quando várias partes do sistema precisam reagir a mudanças em um mesmo ponto.&lt;/p&gt;

&lt;p&gt;Esse padrão promove o desacoplamento entre quem emite o evento e quem reage a ele, permitindo que novos observadores sejam adicionados ou removidos em tempo de execução, sem alterar o sujeito.&lt;/p&gt;

&lt;p&gt;Em resumo, o Observer estabelece um mecanismo de notificação automática, garantindo que todos os interessados estejam atualizados sempre que algo importante acontece.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemplo:
&lt;/h2&gt;

&lt;p&gt;As classes que devem reagir a mudanças se inscrevem no sujeito responsável por emitir essas mudanças.&lt;/p&gt;

&lt;p&gt;A classe principal recebe os observadores via o método &lt;strong&gt;addObserver()&lt;/strong&gt;, registrando as implementações interessadas em ser notificadas.&lt;/p&gt;

&lt;p&gt;O método &lt;strong&gt;newStockData()&lt;/strong&gt; executa a ação principal e, em seguida, notifica todos os observadores inscritos, permitindo que eles executem suas responsabilidades de forma independente.&lt;/p&gt;

&lt;p&gt;Assim caso surja uma demanda de adicionar uma nova açãoao newStockData, você não precisaria modificar a classe&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqmla1ppoqhtj87b8p3jj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqmla1ppoqhtj87b8p3jj.png" alt="Observer" width="800" height="628"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ljhoj688sh13mbe2ijl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ljhoj688sh13mbe2ijl.png" alt="Observer" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>#6 DP: Decorator</title>
      <dc:creator>Bruno</dc:creator>
      <pubDate>Tue, 06 May 2025 18:05:02 +0000</pubDate>
      <link>https://dev.to/stv4ns/6-dp-decorator-24oj</link>
      <guid>https://dev.to/stv4ns/6-dp-decorator-24oj</guid>
      <description>&lt;h2&gt;
  
  
  O que é o Padrão Decorator?
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;Decorator&lt;/strong&gt; é um &lt;strong&gt;padrão de projeto estrutural&lt;/strong&gt; que permite &lt;strong&gt;adicionar comportamentos adicionais&lt;/strong&gt; a um objeto de forma dinâmica. Ele permite que você &lt;strong&gt;encadeie funcionalidades&lt;/strong&gt; (como validação, construção, logging e outras) em um &lt;strong&gt;fluxo sequencial&lt;/strong&gt;, sem modificar a estrutura original da classe. Isso possibilita adicionar ou remover comportamentos com facilidade, mantendo o código mais flexível e desacoplado.&lt;/p&gt;

&lt;p&gt;Em resumo, o &lt;strong&gt;Decorator&lt;/strong&gt; cria uma &lt;strong&gt;cadeia de responsabilidades&lt;/strong&gt; onde cada classe pode adicionar sua funcionalidade à sequência, sem afetar as outras.&lt;/p&gt;




&lt;h2&gt;
  
  
  Exemplo prático
&lt;/h2&gt;

&lt;p&gt;Imagina que você precisa realizar várias validações (como validar o &lt;strong&gt;usuário&lt;/strong&gt;, &lt;strong&gt;estoque&lt;/strong&gt; e &lt;strong&gt;status&lt;/strong&gt;), mas não quer que elas fiquem &lt;strong&gt;fortemente acopladas&lt;/strong&gt;. O objetivo é &lt;strong&gt;poder adicionar, remover ou reorganizar facilmente as validações&lt;/strong&gt; sem mexer nas classes existentes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sem o Decorator:
&lt;/h3&gt;

&lt;p&gt;Sem o padrão Decorator, você teria algo assim:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cada validação seria chamada individualmente, uma após a outra, com código acoplado e sem flexibilidade para adicionar ou remover comportamentos sem alterar diretamente o código.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0thhca5k6q3h5czz1ymb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0thhca5k6q3h5czz1ymb.png" alt="Sem Decorator" width="494" height="381"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyClass&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;[])&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

        &lt;span class="nc"&gt;ValidaEstoque&lt;/span&gt; &lt;span class="n"&gt;validaEstoque&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ValidaEstoque&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;validaEstoque&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;valida&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="nc"&gt;ValidaUsuario&lt;/span&gt; &lt;span class="n"&gt;validaUsuario&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ValidaUsuario&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;validaUsuario&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;valida&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="nc"&gt;ValidaStatus&lt;/span&gt; &lt;span class="n"&gt;validaStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ValidaStatus&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;validaStatus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;valida&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ValidaEstoque&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;valida&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// lógica de validação de estoque&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ValidaUsuario&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;valida&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// lógica de validação de usuário&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ValidaStatus&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;valida&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// lógica de validação de status&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com o Decorator:&lt;br&gt;
Com o padrão Decorator, você pode encadear validações de forma dinâmica, passando o "próximo" validador para o próximo da cadeia. Isso facilita a extensão e a modificação das validações sem mexer no código das classes específicas.&lt;/p&gt;

&lt;p&gt;Cada "decorador" implementa uma lógica de validação e, ao final, passa a responsabilidade para o próximo validador da cadeia.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fklr4bh75bhto4o2aahh8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fklr4bh75bhto4o2aahh8.png" alt=" " width="544" height="363"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyClass&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

        &lt;span class="c1"&gt;// Encadeando os validadores&lt;/span&gt;
        &lt;span class="nc"&gt;Valida&lt;/span&gt; &lt;span class="n"&gt;validador&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ValidaEstoque&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
                                &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ValidaUsuario&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
                                    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ValidaStatus&lt;/span&gt;&lt;span class="o"&gt;()));&lt;/span&gt;

        &lt;span class="n"&gt;validador&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;valida&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Interface base para os validadores&lt;/span&gt;
&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Valida&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;valida&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Validador abstrato base com lógica comum&lt;/span&gt;
&lt;span class="kd"&gt;abstract&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BaseValidadorDecorator&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Valida&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="nc"&gt;Valida&lt;/span&gt; &lt;span class="n"&gt;proximo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;BaseValidadorDecorator&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Valida&lt;/span&gt; &lt;span class="n"&gt;proximo&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;proximo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;proximo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;valida&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;executarValidacao&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;proximo&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;proximo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;valida&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Chama o próximo validador&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="kd"&gt;abstract&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;executarValidacao&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Validador de Status (último da cadeia, mas seguro sozinho)&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ValidaStatus&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;BaseValidadorDecorator&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;ValidaStatus&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Não há próximo validador&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;executarValidacao&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Validando status..."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica de validação de status&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Validador de Usuário&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ValidaUsuario&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;BaseValidadorDecorator&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;ValidaUsuario&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Valida&lt;/span&gt; &lt;span class="n"&gt;proximo&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;proximo&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;executarValidacao&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Validando usuário..."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica de validação de usuário&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Validador de Estoque&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ValidaEstoque&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;BaseValidadorDecorator&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;ValidaEstoque&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Valida&lt;/span&gt; &lt;span class="n"&gt;proximo&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;proximo&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;executarValidacao&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Validando estoque..."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica de validação de estoque&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Vantagens do Decorator:
&lt;/h2&gt;

&lt;p&gt;Flexibilidade: Você pode adicionar ou remover validadores facilmente, sem alterar a estrutura do código. Só precisa instanciar e passar os decoradores na ordem desejada.&lt;/p&gt;

&lt;p&gt;Desacoplamento: Cada validador é independente e sabe apenas sobre a sua validação e o "próximo", sem depender de implementações específicas.&lt;/p&gt;

&lt;p&gt;Extensibilidade: Se precisar adicionar mais validações, basta criar uma nova classe que implemente BaseValidadorDecorator e passá-la na cadeia.&lt;/p&gt;

&lt;p&gt;Melhor manutenção: Como o código é mais modular, fica mais fácil de entender, testar e manter.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>#5 DP: Adapter</title>
      <dc:creator>Bruno</dc:creator>
      <pubDate>Sat, 03 May 2025 12:59:29 +0000</pubDate>
      <link>https://dev.to/stv4ns/5-dp-adapter-49el</link>
      <guid>https://dev.to/stv4ns/5-dp-adapter-49el</guid>
      <description>&lt;h2&gt;
  
  
  O que é?
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;Adapter&lt;/strong&gt; é um &lt;strong&gt;padrão de projeto estrutural&lt;/strong&gt; que tem como objetivo &lt;strong&gt;"traduzir" ou adaptar o funcionamento de um código X para que seja compatível com o código Y&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Imagine que você tem várias classes de pagamento que implementam uma interface comum chamada &lt;code&gt;Pagamento&lt;/code&gt; — por exemplo: &lt;code&gt;Pix&lt;/code&gt;, &lt;code&gt;Ted&lt;/code&gt; e &lt;code&gt;Boleto&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Agora, sua equipe precisa integrar uma &lt;strong&gt;nova forma de pagamento&lt;/strong&gt;, como &lt;code&gt;PayPal&lt;/code&gt;, desenvolvida por outra squad ou vinda de uma &lt;strong&gt;biblioteca de terceiros&lt;/strong&gt;. Essa classe &lt;code&gt;PayPal&lt;/code&gt; &lt;strong&gt;não implementa a interface &lt;code&gt;Pagamento&lt;/code&gt;&lt;/strong&gt;, e isso &lt;strong&gt;quebraria o padrão da sua aplicação&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Para resolver esse problema sem modificar a biblioteca externa (o que muitas vezes nem é possível), usamos o padrão &lt;strong&gt;Adapter&lt;/strong&gt;, que atua como um &lt;strong&gt;"tradutor" entre as interfaces&lt;/strong&gt;. Ele faz com que a classe &lt;code&gt;PayPal&lt;/code&gt; seja compatível com a interface &lt;code&gt;Pagamento&lt;/code&gt;, &lt;strong&gt;sem que a classe original precise ser alterada&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quando usar Adapter:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quando você quer usar uma classe existente, mas ela não implementa a interface esperada.&lt;/li&gt;
&lt;li&gt;Quando não é possível modificar a classe original (ex: código de terceiros).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Exemplo:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Pagamento&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;pagar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// CLASSE EXTERNA( NAO MODIFICAVEL)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PayPalApi&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;sendPayment&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Pagamento de R$"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" feito via PayPal."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Adapter mantendo o padrão de pagamentos &lt;/span&gt;
&lt;span class="c1"&gt;// Invoca a biblioteca terceira&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PayPalAdapter&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Pagamento&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;PayPalApi&lt;/span&gt; &lt;span class="n"&gt;paypal&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;PayPalAdapter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;PayPalApi&lt;/span&gt; &lt;span class="n"&gt;paypal&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;paypal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;paypal&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;pagar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;paypal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sendPayment&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// adapta a chamada&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Se a biblioteca do PAYPAL tiver alguma alteração o código client fica desacoplado dessas alterações&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;🎯 Cenário 2: Leitor de Cartão SD vs. Cartão MicroSD&lt;br&gt;
Sua aplicação trabalha com leitores que aceitam CartaoSD, mas agora você precisa usar um CartaoMicroSD (incompatível). Usamos um Adapter para que o CartaoMicroSD funcione no leitor padrão.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;CartaoSD&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;lerDados&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Classe que já funciona (padronizada)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CartaoSDOriginal&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;CartaoSD&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;lerDados&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Dados lidos do cartão SD."&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Classe incompatível( precisa de tradução )&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CartaoMicroSD&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;acessarDados&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Dados lidos do cartão MicroSD."&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt; 

&lt;span class="c1"&gt;// Adapter &lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MicroSDAdapter&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;CartaoSD&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;CartaoMicroSD&lt;/span&gt; &lt;span class="n"&gt;microSD&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;MicroSDAdapter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;CartaoMicroSD&lt;/span&gt; &lt;span class="n"&gt;microSD&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;microSD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;microSD&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;lerDados&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;microSD&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;acessarDados&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// adaptação da chamada&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>#4 DP: Facade</title>
      <dc:creator>Bruno</dc:creator>
      <pubDate>Fri, 02 May 2025 12:06:01 +0000</pubDate>
      <link>https://dev.to/stv4ns/4-dp-facade-1i9k</link>
      <guid>https://dev.to/stv4ns/4-dp-facade-1i9k</guid>
      <description>&lt;h2&gt;
  
  
  O que é?
&lt;/h2&gt;

&lt;p&gt;O Facade é um padrão de projeto do tipo estrutural. Ele consiste na criação de uma classe intermediária (ou fachada) que expõe uma interface simplificada para um conjunto de classes ou processos mais complexos.&lt;/p&gt;

&lt;p&gt;Seu principal objetivo é desacoplar a lógica de negócios da complexidade de múltiplas instâncias e chamadas internas, permitindo que outras partes do sistema interajam com uma interface unificada e mais limpa. Isso melhora a organização do código, facilita a manutenção e reduz a dependência direta de implementações internas.&lt;/p&gt;




&lt;h2&gt;
  
  
  Exemplo
&lt;/h2&gt;

&lt;p&gt;Antes: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sua classe de serviço conhecendo todas as instancias e invocações
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PedidoService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;EstoqueService&lt;/span&gt; &lt;span class="n"&gt;estoqueService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;PagamentoService&lt;/span&gt; &lt;span class="n"&gt;pagamentoService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;EmailService&lt;/span&gt; &lt;span class="n"&gt;emailService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;PedidoService&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;EstoqueService&lt;/span&gt; &lt;span class="n"&gt;estoqueService&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                         &lt;span class="nc"&gt;PagamentoService&lt;/span&gt; &lt;span class="n"&gt;pagamentoService&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                         &lt;span class="nc"&gt;EmailService&lt;/span&gt; &lt;span class="n"&gt;emailService&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;estoqueService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;estoqueService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pagamentoService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pagamentoService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;emailService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;emailService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;processarPedido&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Cliente&lt;/span&gt; &lt;span class="n"&gt;cliente&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Cliente&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"João"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;Produto&lt;/span&gt; &lt;span class="n"&gt;produto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Produto&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Notebook"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;estoqueService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;temProduto&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;produto&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;pagamentoService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;processarPagamento&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cliente&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;produto&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;emailService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;enviarConfirmacao&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cliente&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;RuntimeException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Produto sem estoque."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois com Facade:&lt;br&gt;
O fluxo desacoplado da classe serviço:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Evitar regras complexas em classes facade
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PedidoService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;EstoqueService&lt;/span&gt; &lt;span class="n"&gt;estoqueService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;PedidoFacade&lt;/span&gt; &lt;span class="n"&gt;pedidoFacade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;PedidoService&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;EstoqueService&lt;/span&gt; &lt;span class="n"&gt;estoqueService&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;PedidoFacade&lt;/span&gt; &lt;span class="n"&gt;pedidoFacade&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;estoqueService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;estoqueService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pedidoFacade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pedidoFacade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;processarPedido&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Cliente&lt;/span&gt; &lt;span class="n"&gt;cliente&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Cliente&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"João"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;Produto&lt;/span&gt; &lt;span class="n"&gt;produto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Produto&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Notebook"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;estoqueService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;temProduto&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;produto&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;RuntimeException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Produto sem estoque."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;pedidoFacade&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;finalizarPedido&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cliente&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;produto&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PedidoFacade&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;PagamentoService&lt;/span&gt; &lt;span class="n"&gt;pagamentoService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;EmailService&lt;/span&gt; &lt;span class="n"&gt;emailService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;PedidoFacade&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;PagamentoService&lt;/span&gt; &lt;span class="n"&gt;pagamentoService&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;EmailService&lt;/span&gt; &lt;span class="n"&gt;emailService&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pagamentoService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pagamentoService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;emailService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;emailService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;finalizarPedido&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Cliente&lt;/span&gt; &lt;span class="n"&gt;cliente&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Produto&lt;/span&gt; &lt;span class="n"&gt;produto&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;pagamentoService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;processarPagamento&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cliente&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;produto&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;emailService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;enviarConfirmacao&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cliente&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Esse padrão ajuda especialmente quando você tem processos que precisam ser reutilizados em mais de uma parte do sistema, encapsulando toda a complexidade por trás de uma única interface limpa.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
