[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-patterny-chto-takoe-pattern-strategy":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":16,"progress":17,"seo":18},1261,"chto-takoe-pattern-strategy",40,"patterny","Паттерны","🧩","Что такое паттерн Strategy?","Strategy -- паттерн, определяющий семейство алгоритмов, инкапсулирующий каждый и делающий их взаимозаменяемыми. Клиент выбирает алгоритм в runtime.\n\n> Аналогия из жизни: Strategy -- как навигатор с выбором маршрута. Вы можете ехать \"быстрее\", \"короче\" или \"без платных дорог\" -- алгоритм маршрутизации меняется, а интерфейс навигатора остаётся прежним.\n\n\u003Cdetails>\n\u003Csummary>Strategy через интерфейс\u003C\u002Fsummary>\n\n```java\n\u002F\u002F Интерфейс стратегии\ninterface PricingStrategy {\n    BigDecimal calculatePrice(BigDecimal basePrice, int quantity);\n}\n\n\u002F\u002F Конкретные стратегии\nclass RegularPricing implements PricingStrategy {\n    public BigDecimal calculatePrice(BigDecimal basePrice, int quantity) {\n        return basePrice.multiply(BigDecimal.valueOf(quantity));\n    }\n}\n\nclass BulkPricing implements PricingStrategy {\n    public BigDecimal calculatePrice(BigDecimal basePrice, int quantity) {\n        BigDecimal discount = quantity > 100 ? new BigDecimal(\"0.8\") : new BigDecimal(\"0.9\");\n        return basePrice.multiply(BigDecimal.valueOf(quantity)).multiply(discount);\n    }\n}\n\n\u002F\u002F Контекст, использующий стратегию\nclass OrderService {\n    private final PricingStrategy pricingStrategy;\n\n    OrderService(PricingStrategy pricingStrategy) { \u002F\u002F внедряется через DI\n        this.pricingStrategy = pricingStrategy;\n    }\n\n    BigDecimal calculateTotal(BigDecimal price, int qty) {\n        return pricingStrategy.calculatePrice(price, qty);\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\nС лямбдами (Java 8+) Strategy можно реализовать без отдельных классов:\n\n```java\nMap\u003CString, BiFunction\u003CBigDecimal, Integer, BigDecimal>> strategies = Map.of(\n    \"regular\", (price, qty) -> price.multiply(BigDecimal.valueOf(qty)),\n    \"bulk\",    (price, qty) -> price.multiply(BigDecimal.valueOf(qty))\n                                    .multiply(new BigDecimal(\"0.85\"))\n);\n\nBigDecimal total = strategies.get(\"bulk\").apply(price, quantity);\n```\n\n### Важное\n\n- Strategy = OCP (Open\u002FClosed Principle) на практике\n- В Java 8+ простые Strategy заменяются лямбдами (`Comparator`, `Function`)\n- Spring: стратегии как бины, выбор через `@Qualifier` или `Map\u003CString, Strategy>`\n\n### Частые ошибки\n\n- Strategy + if\u002Felse для выбора -- выбор стратегии через DI\u002FMap, а не через if\u002Felse\n- Strategy для двух строк кода -- лямбда проще отдельного класса\n\n### Как используется в 2026\n\n- `Comparator`, `Predicate`, `Function` -- встроенные Strategy в JDK\n- Spring: `List\u003CPaymentStrategy>` -- Spring автоматически собирает все реализации\n\n> **На собеседовании:** покажите связь Strategy с OCP и объясните, когда достаточно лямбды вместо полноценного класса. Частая ошибка -- реализовать Strategy, а выбор стратегии сделать через if\u002Felse, что сводит весь паттерн на нет.","","junior",[15],"patterns",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":20,"featuredSnippetReady":23},"Что такое паттерн Singleton? — Gymterview","Singleton -- паттерн, гарантирующий, что у класса есть только один экземпляр, и предоставляющий глобальную точку доступа к нему.","Singleton -- паттерн, гарантирующий, что у класса есть только один экземпляр, и предоставляющий глобальную точку доступа",[15,13],true]