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

No packages published

Languages