Este projeto é uma aplicação Spring Boot simples, criada com o objetivo de estudar e demonstrar o uso de padrões de projeto amplamente utilizados no mercado, especificamente:
- Strategy
- Factory Method
A aplicação simula o processamento de pedidos com diferentes formas de pagamento, permitindo que o comportamento de pagamento seja alterado dinamicamente, sem modificar o código principal da aplicação.
Demonstrar, de forma prática e didática:
- Como aplicar padrões de projeto em um projeto Spring Boot
- Como utilizar Injeção de Dependência do Spring
- Como manter o código desacoplado, extensível e aderente aos princípios SOLID
- Java 20
- Spring Boot
- Spring Web
- Spring Data JPA
- Maven
O padrão Strategy é utilizado para encapsular as diferentes formas de pagamento.
Cada forma de pagamento implementa a interface PagamentoStrategy, permitindo que o comportamento seja trocado em tempo de execução.
Exemplos de estratégias:
- Pagamento via PIX
- Pagamento via Cartão de Crédito
- Pagamento via Boleto
O padrão Factory Method é aplicado na classe PagamentoFactory.
Ela é responsável por:
- Centralizar a criação/seleção da estratégia de pagamento
- Retornar automaticamente a implementação correta com base no tipo informado
Com o apoio do Spring, todas as estratégias são injetadas automaticamente, tornando a factory simples, limpa e escalável.
A aplicação passou a utilizar o Spring Data JPA para persistência dos pedidos.
A interface PedidoRepository é responsável por salvar os pedidos processados, desacoplando a lógica de negócio do acesso a dados.
Esse uso reforça boas práticas de arquitetura em camadas e facilita futuras evoluções, como consultas e relatórios.
O padrão Factory Method é aplicado na classe PagamentoFactory.
Ela é responsável por:
- Centralizar a criação/seleção da estratégia de pagamento
- Retornar automaticamente a implementação correta com base no tipo informado
Com o apoio do Spring, todas as estratégias são injetadas automaticamente, tornando a factory simples, limpa e escalável.
com.fvss.designerpatterns
│
├── controller
│ └── PedidoController.java
│
├── model
│ ├── Pedido.java
│ └── ItemPedido.java
│
├── repository
│ └── PedidoRepository.java
│
├── service
│ ├── PedidoService.java
│ └── pagamento
│ ├── PagamentoStrategy.java
│ ├── PagamentoFactory.java
│ ├── PixPagamento.java
│ ├── CartaoPagamento.java
│ └── BoletoPagamento.java
│
---
## 🔄 Fluxo da Aplicação
1. O cliente faz uma requisição para o endpoint `/pedidos/pagar`
2. Envia:
- O tipo de pagamento (`pix`, `cartao` ou `boleto`)
- Uma lista de itens do pedido no corpo da requisição
3. O `PedidoController` delega o processamento ao `PedidoService`
4. O `PedidoService`:
- Cria/processa o pedido
- Adiciona os itens recebidos
- Calcula o valor total
- Solicita à `PagamentoFactory` a estratégia de pagamento adequada
- Executa o pagamento
- Retorna o pedido processado
5. O `PedidoController` salva o pedido utilizando o `PedidoRepository`
---
## 🌐 Endpoint Disponível
### ▶️ Processar pagamento
**POST** `/pedidos/pagar`
#### Parâmetros de Query
| Parâmetro | Tipo | Descrição |
|----------|--------|----------------------------|
| tipoPagamento | String | Tipo do pagamento (`pix`, `cartao`, `boleto`) |
#### Corpo da Requisição (JSON)
```json
[
{
"nome": "Notebook",
"quantidade": 1,
"precoUnitario": 3500.00
},
{
"nome": "Mouse",
"quantidade": 2,
"precoUnitario": 150.00
}
]
Pedido processado com sucesso!
POST http://localhost:8080/pedidos/pagar?tipoPagamento=pix
POST http://localhost:8080/pedidos/pagar?tipoPagamento=cartao
POST http://localhost:8080/pedidos/pagar?tipoPagamento=boleto
Projeto desenvolvido para fins de estudo e prática de Design Patterns com Spring Boot.
Autor: FVSSANTOS