FeeCalculator.java
package com.designpatterns.behavioral.strategy.applied;
import java.util.Map;
public class FeeCalculator {
private final Map<TransactionType, FeeCalculationStrategy> strategies;
public FeeCalculator(Map<TransactionType, FeeCalculationStrategy> strategies) {
this.strategies = Map.copyOf(strategies);
}
public static FeeCalculator withDefaultStrategies() {
return new FeeCalculator(Map.of(
TransactionType.PIX, new PixFeeStrategy(),
TransactionType.TED, new TedFeeStrategy(),
TransactionType.BOLETO, new BoletoFeeStrategy()
));
}
public long calculateFeeCents(TransactionType type, long amountCents) {
FeeCalculationStrategy strategy = strategies.get(type);
if (strategy == null) {
throw new IllegalArgumentException("no fee strategy registered for " + type);
}
return strategy.calculateFeeCents(amountCents);
}
}