Skip to content

O Strategy Pattern é um padrão de projeto comportamental que permite definir uma família de algoritmos, encapsulá-los em classes separadas e torná-los intercambiáveis. Assim, o objeto cliente pode escolher qual estratégia usar em tempo de execução sem precisar alterar sua própria implementação

Notifications You must be signed in to change notification settings

marciokgr/StrategyPatternExample

Repository files navigation

Strategy Pattern Example - API de Pagamentos

Este projeto demonstra a implementação do padrão de projeto Strategy Pattern em C# usando uma API ASP.NET Core para processamento de pagamentos.

📋 Sobre o Projeto

O Strategy Pattern permite definir uma família de algoritmos, encapsulá-los e torná-los intercambiáveis. Neste exemplo, cada método de pagamento (Cartão de Crédito, PayPal, Boleto, Pix) é uma estratégia diferente que pode ser selecionada em tempo de execução.

🏗️ Estrutura do Projeto

StrategyPatternExample/
├── Controllers/
│   └── PaymentController.cs      # Controller da API
├── Models/
│   ├── PaymentRequest.cs         # Modelo de requisição
│   ├── PaymentResponse.cs        # Modelo de resposta
│   └── PaymentResult.cs          # Resultado do processamento
├── Services/
│   └── PaymentContext.cs         # Contexto que usa as estratégias
├── Strategies/
│   ├── IPaymentStrategy.cs       # Interface da estratégia
│   ├── CreditCardPaymentStrategy.cs
│   ├── PayPalPaymentStrategy.cs
│   ├── BankSlipPaymentStrategy.cs
│   └── PixPaymentStrategy.cs
├── Program.cs                    # Configuração da aplicação
└── StrategyPatternExample.csproj

🎯 Como Funciona

Strategy Pattern

  1. IPaymentStrategy: Interface que define o contrato para todas as estratégias de pagamento
  2. Estratégias Concretas: Implementações específicas para cada método de pagamento
  3. PaymentContext: Classe que mantém referência à estratégia e delega o processamento

Fluxo de Execução

Cliente → PaymentController → PaymentContext → IPaymentStrategy (concreta) → Resultado

🚀 Como Executar

Pré-requisitos

  • .NET 8.0 SDK ou superior
  • Visual Studio 2022 ou VS Code

Executando o Projeto

# Restaurar dependências
dotnet restore

# Executar a aplicação
dotnet run

A API estará disponível em:

  • HTTP: http://localhost:5000
  • HTTPS: https://localhost:5001
  • Swagger UI: https://localhost:5001/swagger

📡 Endpoints da API

1. Processar Pagamento

POST /api/payment

Body (JSON):

{
  "amount": 100.50,
  "paymentMethod": "CreditCard",
  "paymentDetails": {
    "CardNumber": "1234567890123456",
    "CardHolderName": "João Silva",
    "ExpiryDate": "12/25",
    "CVV": "123"
  }
}

Resposta de Sucesso:

{
  "success": true,
  "message": "Pagamento de R$ 100,50 processado com sucesso via Cartão de Crédito",
  "transactionId": "CC-abc123def456...",
  "processedAt": "2024-01-15T10:30:00Z"
}

2. Listar Métodos de Pagamento Disponíveis

GET /api/payment/methods

Resposta:

["CreditCard", "PayPal", "BankSlip", "Pix"]

💳 Métodos de Pagamento Suportados

1. CreditCard (Cartão de Crédito)

Campos obrigatórios:

  • CardNumber: Número do cartão
  • CardHolderName: Nome do portador
  • ExpiryDate: Data de validade (MM/AA)
  • CVV: Código de segurança

Exemplo:

{
  "amount": 250.00,
  "paymentMethod": "CreditCard",
  "paymentDetails": {
    "CardNumber": "4111111111111111",
    "CardHolderName": "Maria Santos",
    "ExpiryDate": "12/25",
    "CVV": "123"
  }
}

2. PayPal

Campos obrigatórios:

  • Email: Email da conta PayPal

Exemplo:

{
  "amount": 150.00,
  "paymentMethod": "PayPal",
  "paymentDetails": {
    "Email": "usuario@example.com"
  }
}

3. BankSlip (Boleto)

Campos obrigatórios:

  • PayerName: Nome do pagador
  • PayerDocument: CPF ou CNPJ

Exemplo:

{
  "amount": 500.00,
  "paymentMethod": "BankSlip",
  "paymentDetails": {
    "PayerName": "João da Silva",
    "PayerDocument": "12345678901"
  }
}

4. Pix

Campos obrigatórios:

  • PixKey: Chave Pix (CPF, CNPJ, Email, Telefone ou Chave Aleatória)

Exemplo:

{
  "amount": 75.50,
  "paymentMethod": "Pix",
  "paymentDetails": {
    "PixKey": "usuario@example.com"
  }
}

🧪 Testando com cURL

Processar pagamento com Cartão de Crédito:

curl -X POST "https://localhost:5001/api/payment" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 100.50,
    "paymentMethod": "CreditCard",
    "paymentDetails": {
      "CardNumber": "1234567890123456",
      "CardHolderName": "João Silva",
      "ExpiryDate": "12/25",
      "CVV": "123"
    }
  }'

Listar métodos disponíveis:

curl -X GET "https://localhost:5001/api/payment/methods"

🎓 Benefícios do Strategy Pattern

  1. Flexibilidade: Fácil adicionar novos métodos de pagamento sem modificar código existente
  2. Manutenibilidade: Cada estratégia é isolada e independente
  3. Testabilidade: Cada estratégia pode ser testada separadamente
  4. Extensibilidade: Basta implementar IPaymentStrategy para adicionar um novo método
  5. Princípio Aberto/Fechado: Aberto para extensão, fechado para modificação

🔧 Adicionando uma Nova Estratégia

Para adicionar um novo método de pagamento:

  1. Criar uma nova classe implementando IPaymentStrategy:
public class NewPaymentStrategy : IPaymentStrategy
{
    public string PaymentMethodName => "NewMethod";
    
    public PaymentResult ProcessPayment(decimal amount, Dictionary<string, string> paymentDetails)
    {
        // Implementação do processamento
    }
}
  1. Registrar no Program.cs:
builder.Services.AddScoped<IPaymentStrategy, NewPaymentStrategy>();

Pronto! O novo método estará disponível automaticamente.

📝 Licença

Este é um projeto de exemplo para fins educacionais.

About

O Strategy Pattern é um padrão de projeto comportamental que permite definir uma família de algoritmos, encapsulá-los em classes separadas e torná-los intercambiáveis. Assim, o objeto cliente pode escolher qual estratégia usar em tempo de execução sem precisar alterar sua própria implementação

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages