По мере продвижения проекта, теряясь в блоках if-else, борясь со сложными условиями и повторяющимся кодом, мы ищем решение. Но почему мы должны застревать в блоках if-else? В этой статье давайте узнаем, как избавиться от путаницы if-else с помощью шаблонов Strategy и Factory.
Предположим, вы разрабатываете приложение для электронной коммерции, и вам необходимо поддерживать различные способы оплаты, такие как кредитная карта, дебетовая карта и криптовалюта. Вы начинаете с блоков if-else для обработки платежей:
public class PaymentService { public void processPayment(String paymentType) { if (paymentType.equals("CREDIT_CARD")) { System.out.println("Processing credit card payment..."); } else if (paymentType.equals("DEBIT_CARD")) { System.out.println("Processing debit card payment..."); } else if (paymentType.equals("CRYPTO")) { System.out.println("Processing crypto payment..."); } else { throw new IllegalArgumentException("Invalid payment type"); } } }
Хотя на первый взгляд это может показаться простым, по мере увеличения количества способов оплаты увеличивается и сложность if-else. Новый способ оплаты означает добавление нового условия. В результате получается куча кода, которым сложно управлять. И этот метод противоречит принципу открытости-закрытости.
Но для решения этой проблемы мы можем использовать шаблоны «Стратегия» и «Фабрика».
Сначала давайте создадим перечисление:
public enum PaymentType { CREDIT_CARD, DEBIT_CARD, CRYPTO }
public interface PaymentStrategy { void pay(PaymentRequest request); } public class CreditCardPayment implements PaymentStrategy { @Override public void pay(PaymentRequest request) { System.out.println("Processing $type payment".replace("$type", String.valueOf(request.getPaymentType()))); } } public class DebitCardPayment implements PaymentStrategy { @Override public void pay(PaymentRequest request) { System.out.println("Processing $type payment".replace("$type", String.valueOf(request.getPaymentType()))); } } public class CryptoPayment implements PaymentStrategy { @Override public void pay(PaymentRequest request) { System.out.println("Processing $type payment".replace("$type", String.valueOf(request.getPaymentType()))); } }
На этом этапе из общего интерфейса реализуется отдельная стратегия для каждого способа оплаты. Теперь, с помощью Factory Pattern, мы решим, какую стратегию выбрать.
На этом этапе мы можем очистить и оптимизировать Factory Pattern с помощью EnumMap.
public class PaymentFactory { private static final Mapstrategies = new EnumMap(PaymentType.class); static { strategies.put(PaymentType.CREDIT_CARD, new CreditCardPayment()); strategies.put(PaymentType.DEBIT_CARD, new DebitCardPayment()); strategies.put(PaymentType.CRYPTO, new CryptoPayment()); } public static PaymentStrategy getPaymentStrategy(PaymentType paymentType) { PaymentStrategy strategy = strategies.get(paymentType); if (Objects.isNull(strategy)) throw new IllegalArgumentException("Strategy not found"); return strategy; } }
Теперь давайте воспользуемся тем, что мы сделали.
public class PaymentService { public void processPayment(PaymentRequest request) { // Don't forget to check objects if null! if (Objects.isNull(request) || Objects.isNull(request.getPaymentType()) throw new IllegalArgumentException("Request can not be null!"); PaymentStrategy strategy = PaymentFactory.getPaymentStrategy(request.getPaymentType()); strategy.pay(request); } }
На самом деле нам не нужны блоки if-else для обработки платежей. Благодаря Strategy и Factory Patterns наш код стал более чистым, модульным и расширяемым.
1. Расширяемость: Для добавления нового способа оплаты требуется только новый класс и несколько строк кода.
2. Читабельность: Используя стратегии и фабрику вместо блоков if-else, вы делаете свой код более понятным и управляемым.
3. Удобство сопровождения: С помощью стратегии и шаблона фабрики можно вносить изменения в код, не затрагивая другие части кода.
Если вы работаете над растущим проектом, вам не следует использовать блоки if-else. Шаблоны «Стратегия» и «Фабрика» — идеальные решения, которые сделают ваш код более чистым, модульным и удобным в сопровождении.
Как вы можете видеть в этой статье, использование шаблонов проектирования вместо блоков if-else для управления платежными транзакциями делает проект более разрабатываемым и улучшает читаемость кода. Попробуйте эти шаблоны в своем следующем проекте вместо использования блоков if-else.
...
Спасибо, что прочитали мою статью! Если у вас есть какие-либо вопросы, отзывы или мысли, которыми вы хотели бы поделиться, я буду рад услышать их в комментариях.
Вы можете подписаться на меня на dev.to, чтобы получить дополнительную информацию по этой теме и другим моим публикациям.
Спасибо??
Чтобы подписаться на меня в LinkedIn: https://www.linkedin.com/in/tamerardal/
Средний: больше не используйте блоки if-else! Используйте стратегию и шаблон Factory вместе
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3