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.
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.
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
- IPaymentStrategy: Interface que define o contrato para todas as estratégias de pagamento
- Estratégias Concretas: Implementações específicas para cada método de pagamento
- PaymentContext: Classe que mantém referência à estratégia e delega o processamento
Cliente → PaymentController → PaymentContext → IPaymentStrategy (concreta) → Resultado
- .NET 8.0 SDK ou superior
- Visual Studio 2022 ou VS Code
# Restaurar dependências
dotnet restore
# Executar a aplicação
dotnet runA API estará disponível em:
- HTTP:
http://localhost:5000 - HTTPS:
https://localhost:5001 - Swagger UI:
https://localhost:5001/swagger
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"
}GET /api/payment/methods
Resposta:
["CreditCard", "PayPal", "BankSlip", "Pix"]Campos obrigatórios:
CardNumber: Número do cartãoCardHolderName: Nome do portadorExpiryDate: 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"
}
}Campos obrigatórios:
Email: Email da conta PayPal
Exemplo:
{
"amount": 150.00,
"paymentMethod": "PayPal",
"paymentDetails": {
"Email": "usuario@example.com"
}
}Campos obrigatórios:
PayerName: Nome do pagadorPayerDocument: CPF ou CNPJ
Exemplo:
{
"amount": 500.00,
"paymentMethod": "BankSlip",
"paymentDetails": {
"PayerName": "João da Silva",
"PayerDocument": "12345678901"
}
}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"
}
}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"
}
}'curl -X GET "https://localhost:5001/api/payment/methods"- Flexibilidade: Fácil adicionar novos métodos de pagamento sem modificar código existente
- Manutenibilidade: Cada estratégia é isolada e independente
- Testabilidade: Cada estratégia pode ser testada separadamente
- Extensibilidade: Basta implementar
IPaymentStrategypara adicionar um novo método - Princípio Aberto/Fechado: Aberto para extensão, fechado para modificação
Para adicionar um novo método de pagamento:
- 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
}
}- Registrar no
Program.cs:
builder.Services.AddScoped<IPaymentStrategy, NewPaymentStrategy>();Pronto! O novo método estará disponível automaticamente.
Este é um projeto de exemplo para fins educacionais.