Вы сделали вид стратегии здесь.Но Вы должны были определить общий интерфейс, более представительный для бизнеса, например:
public interface TicketStrategy {
Double fare(final Integer quantity);
}
Вы можете сделать его FunctionalInterface, если хотите:
@FunctionalInterface
public interface TicketStrategy {
Double fare(final Integer quantity);
}
Тогда вы реализуете так, как вы это сделали:
public class TicketStrategies {
public static final TicketStrategy VIP = noOfTickets -> noOfTickets * 400.00;
public static final TicketStrategy RECLINER = noOfTickets-> noOfTickets * 200.00;
}
Тогда ваш основной выглядит так:
public static void main(String[] args) {
ITicket ticketsVip = new ServiceImpl(RECLINER));
System.out.println(ticketsVip.calculateFare(5));
}
Что вы можете сделать, это использовать его с заводским шаблоном, подобным этому:
public class TicketStrategyFactory {
private static final TicketStrategy VIP = noOfTickets -> noOfTickets * 400.00;
private static final TicketStrategy RECLINER = noOfTickets-> noOfTickets * 200.00;
private static final Map<String, TicketStrategy> STRATEGIES;
static {
final HashMap<String, TicketStrategy> strategies = new HashMap<>();
strategies.put("vip", VIP);
strategies.put("recliner", RECLINER);
STRATEGIES = Collections.unmodifiableMap(strategies);
}
public TicketStrategyFactory() {
}
public TicketStrategy create(String type) {
TicketStrategy strategy = STRATEGIES.get(type);
if (strategy == null) {
throw new IllegalArgumentException("Unknown strategy " + type);
}
return strategy;
}
}
public static void main(String[] args) {
TicketStrategyFactory factory = new TicketStrategyFactory();
ITicket ticketsVip = new ServiceImpl(factory.create("vip"));
System.out.println(ticketsVip.calculateFare(5));
}