Я пытаюсь реализовать шаблон разработки стратегии в приведенном ниже фрагменте кода с использованием Java 8. Ищете лучшие способы реализации? - PullRequest
4 голосов
/ 29 сентября 2019

У меня есть реализация сервиса ниже: -

package Java8.controller;

import java.util.function.Function;

public class ServiceImpl implements ITicket {

    Function<Integer,Double> ticketCal;

    public ServiceImpl(Function<Integer,Double> ticketCal){
        this.ticketCal= ticketCal;
    }

    @Override
    public double calculateFare(int quantity) {
        return ticketCal.apply(quantity);
    }

}

Ниже приведены стратегии, которые я создал: -

Стратегия тикета Recliner: -

package Java8.controller;

import java.util.function.Function;

public interface ReclinerTicketStrategy {

    default Function<Integer,Double> reclinerTicketStrategy(){

        return (noOfTickets)->{
            return noOfTickets * 200.00;
        };
    }
}

VIPСтратегия продажи билетов: -

package Java8.controller;

import java.util.function.Function;

public interface VipTicketStrategy {

    default Function<Integer,Double> vipTicketStrategy(){

         return (noOfTickets)->{
             return noOfTickets*400.00;
        };

    }
}

Ниже приведен основной класс, использующий стратегию: -

package Java8.controller;

public class Main implements ReclinerTicketStrategy {

    public Main(){

        ITicket ticketsVip = new ServiceImpl(reclinerTicketStrategy());
        System.out.println(ticketsVip.calculateFare(5));

}

    public static void main(String args[]){
        Main main = new Main();
    }


}


Мой вопрос заключается в том, является ли это правильным способом размещения функции стратегии винтерфейс в качестве метода по умолчанию?ИЛИ есть ли лучшие способы получить его?

Ответы [ 2 ]

2 голосов
/ 29 сентября 2019

Стратегии должны реализовывать абстракцию, необходимую для сервиса.В этом случае службе требуется Function<Integer,Double>, поэтому стратегия будет ...

class ReclinerTicketStrategy implements Function<Integer,Double> {
    @Override
    public Double apply(Integer noOfTickets) {
        return noOfTickets * 200.0;
    }
}

Служба затем создается как,ITicket reclinerTicket = new ServiceImpl(new ReclinerTicketStrategy());

Конечно, если вам не нужно повторно использовать стратегию, тогда лямбда будет достаточной.ITicket reclinerTicket = new ServiceImpl(noOfTickets -> noOfTickets * 200.0);

0 голосов
/ 29 сентября 2019

Вы сделали вид стратегии здесь.Но Вы должны были определить общий интерфейс, более представительный для бизнеса, например:

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));
}
...