JAVA_IIBRARY Telegram 1767
Стратегия в Java —> уходим от нагромождения if-else

Очень часто, когда начинаем писать код и описывать бизнес-логику, мы обклеиваем методы условными конструкциями.

Со временем, при изменении требований или росте сложности, таких условий становится всё больше.

В итоге код становится трудным для поддержки, его тяжело воспринимать, и он теряет черты объектно-ориентированного подхода.

Стратегия —> это поведенческий шаблон проектирования, позволяющий вынести изменяющееся поведение в отдельные классы и подставлять нужную реализацию во время исполнения программы. То есть вместо длинных if-else мы просто передаём объект с требуемой логикой.

Проблема -> громоздкие if-else

public double calculateDiscount(String customerType, double amount) {
if (customerType.equals("regular")) {
return amount * 0.05;
} else if (customerType.equals("vip")) {
return amount * 0.1;
} else if (customerType.equals("super-vip")) {
return amount * 0.2;
} else {
return 0;
}
}


Такой код:

. трудно читать
. неудобно расширять
. легко сломать при добавлении новых веток

Решение через стратегию:

1. Описываем общий интерфейс:

public interface DiscountStrategy {
double applyDiscount(double amount);
}


2. Создаём реализации под разные типы клиентов:

public class RegularDiscount implements DiscountStrategy {
public double applyDiscount(double amount) {
return amount * 0.05;
}
}

public class VipDiscount implements DiscountStrategy {
public double applyDiscount(double amount) {
return amount * 0.1;
}
}

public class SuperVipDiscount implements DiscountStrategy {
public double applyDiscount(double amount) {
return amount * 0.2;
}
}


3. Контекст, который применяет выбранную стратегию:

public class DiscountService {
private final DiscountStrategy strategy;

public DiscountService(DiscountStrategy strategy) {
this.strategy = strategy;
}

public double getDiscountedPrice(double amount) {
return strategy.applyDiscount(amount);
}
}


4. Подбор реализации во время выполнения:

DiscountStrategy strategy = new VipDiscount(); 
DiscountService service = new DiscountService(strategy);

double price = service.getDiscountedPrice(1000); // 100.0


Теперь каждая логика скидки инкапсулирована в своём классе. Если появляются новые условия, меняется только реализация конкретной стратегии, а не весь метод.

Даже выбор стратегии можно полностью отвязать от if-логики:

Map<String, DiscountStrategy> strategies = Map.of(
"regular", new RegularDiscount(),
"vip", new VipDiscount(),
"super-vip", new SuperVipDiscount()
);

DiscountStrategy strategy = strategies.getOrDefault(customerType, amount -> 0.0);
double result = strategy.applyDiscount(1000);


Таким образом, мы избавляемся от условных блоков и делаем код чище, гибче и проще в сопровождении.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
117🔥5👍3



tgoop.com/Java_Iibrary/1767
Create:
Last Update:

Стратегия в Java —> уходим от нагромождения if-else

Очень часто, когда начинаем писать код и описывать бизнес-логику, мы обклеиваем методы условными конструкциями.

Со временем, при изменении требований или росте сложности, таких условий становится всё больше.

В итоге код становится трудным для поддержки, его тяжело воспринимать, и он теряет черты объектно-ориентированного подхода.

Стратегия —> это поведенческий шаблон проектирования, позволяющий вынести изменяющееся поведение в отдельные классы и подставлять нужную реализацию во время исполнения программы. То есть вместо длинных if-else мы просто передаём объект с требуемой логикой.

Проблема -> громоздкие if-else

public double calculateDiscount(String customerType, double amount) {
if (customerType.equals("regular")) {
return amount * 0.05;
} else if (customerType.equals("vip")) {
return amount * 0.1;
} else if (customerType.equals("super-vip")) {
return amount * 0.2;
} else {
return 0;
}
}


Такой код:

. трудно читать
. неудобно расширять
. легко сломать при добавлении новых веток

Решение через стратегию:

1. Описываем общий интерфейс:

public interface DiscountStrategy {
double applyDiscount(double amount);
}


2. Создаём реализации под разные типы клиентов:

public class RegularDiscount implements DiscountStrategy {
public double applyDiscount(double amount) {
return amount * 0.05;
}
}

public class VipDiscount implements DiscountStrategy {
public double applyDiscount(double amount) {
return amount * 0.1;
}
}

public class SuperVipDiscount implements DiscountStrategy {
public double applyDiscount(double amount) {
return amount * 0.2;
}
}


3. Контекст, который применяет выбранную стратегию:

public class DiscountService {
private final DiscountStrategy strategy;

public DiscountService(DiscountStrategy strategy) {
this.strategy = strategy;
}

public double getDiscountedPrice(double amount) {
return strategy.applyDiscount(amount);
}
}


4. Подбор реализации во время выполнения:

DiscountStrategy strategy = new VipDiscount(); 
DiscountService service = new DiscountService(strategy);

double price = service.getDiscountedPrice(1000); // 100.0


Теперь каждая логика скидки инкапсулирована в своём классе. Если появляются новые условия, меняется только реализация конкретной стратегии, а не весь метод.

Даже выбор стратегии можно полностью отвязать от if-логики:

Map<String, DiscountStrategy> strategies = Map.of(
"regular", new RegularDiscount(),
"vip", new VipDiscount(),
"super-vip", new SuperVipDiscount()
);

DiscountStrategy strategy = strategies.getOrDefault(customerType, amount -> 0.0);
double result = strategy.applyDiscount(1000);


Таким образом, мы избавляемся от условных блоков и делаем код чище, гибче и проще в сопровождении.

👉 Java Portal

BY Java Portal | Программирование


Share with your friend now:
tgoop.com/Java_Iibrary/1767

View MORE
Open in Telegram


Telegram News

Date: |

Hui said the messages, which included urging the disruption of airport operations, were attempts to incite followers to make use of poisonous, corrosive or flammable substances to vandalize police vehicles, and also called on others to make weapons to harm police. There have been several contributions to the group with members posting voice notes of screaming, yelling, groaning, and wailing in different rhythms and pitches. Calling out the “degenerate” community or the crypto obsessives that engage in high-risk trading, Co-founder of NFT renting protocol Rentable World emiliano.eth shared this group on his Twitter. He wrote: “hey degen, are you stressed? Just let it out all out. Voice only tg channel for screaming”. Find your optimal posting schedule and stick to it. The peak posting times include 8 am, 6 pm, and 8 pm on social media. Try to publish serious stuff in the morning and leave less demanding content later in the day. Developing social channels based on exchanging a single message isn’t exactly new, of course. Back in 2014, the “Yo” app was launched with the sole purpose of enabling users to send each other the greeting “Yo.” Telegram is a leading cloud-based instant messages platform. It became popular in recent years for its privacy, speed, voice and video quality, and other unmatched features over its main competitor Whatsapp.
from us


Telegram Java Portal | Программирование
FROM American