Sobes.tech
Назад к вопросам
Senior
4

Реализуй паттерн Стратегия для расчёта стоимости доставки и сервис для его применения

Компании, где спрашивали
DNSDNS

Ответ от нейросети

sobes.tech AI

Паттерн Стратегия позволяет определить семейство алгоритмов, инкапсулировать каждый из них и делать их взаимозаменяемыми.

Пример реализации для расчёта стоимости доставки:

// Интерфейс стратегии
public interface DeliveryStrategy {
    double calculateCost(Order order);
}

// Конкретные стратегии
public class StandardDelivery implements DeliveryStrategy {
    public double calculateCost(Order order) {
        return 5.0; // фиксированная стоимость
    }
}

public class ExpressDelivery implements DeliveryStrategy {
    public double calculateCost(Order order) {
        return 10.0 + 0.5 * order.getWeight();
    }
}

public class FreeDelivery implements DeliveryStrategy {
    public double calculateCost(Order order) {
        return 0.0;
    }
}

// Класс заказа
public class Order {
    private double weight;
    // конструкторы, геттеры
    public Order(double weight) {
        this.weight = weight;
    }
    public double getWeight() {
        return weight;
    }
}

// Сервис для применения стратегии
public class DeliveryService {
    private DeliveryStrategy strategy;

    public DeliveryService(DeliveryStrategy strategy) {
        this.strategy = strategy;
    }

    public void setStrategy(DeliveryStrategy strategy) {
        this.strategy = strategy;
    }

    public double calculateDeliveryCost(Order order) {
        return strategy.calculateCost(order);
    }
}

// Использование
public class Main {
    public static void main(String[] args) {
        Order order = new Order(10); // вес 10 кг
        DeliveryService service = new DeliveryService(new StandardDelivery());
        System.out.println("Стоимость доставки: " + service.calculateDeliveryCost(order));

        service.setStrategy(new ExpressDelivery());
        System.out.println("Стоимость экспресс-доставки: " + service.calculateDeliveryCost(order));
    }
}