«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Больше не используйте блоки if-else! Используйте стратегию и шаблон Factory вместе

Больше не используйте блоки if-else! Используйте стратегию и шаблон Factory вместе

Опубликовано 9 ноября 2024 г.
Просматривать:791

Don’t use if-else blocks anymore! Use Strategy and Factory Pattern Together

По мере продвижения проекта, теряясь в блоках 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, мы решим, какую стратегию выбрать.

Шаг 2. Выбор стратегии с фабричным шаблоном

На этом этапе мы можем очистить и оптимизировать Factory Pattern с помощью EnumMap.

public class PaymentFactory {
    private static final Map strategies = 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 вместе

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/tamerardal/dont-use-if-else-blocks-anymore-use-strategy-and-factory-pattern-together-4i77?1 Если есть какие-либо нарушения, пожалуйста, свяжитесь с Study_golang@163 .comdelete
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3