首页  >  文章  >  Java  >  不要再使用 if-else 块了!结合使用策略和工厂模式

不要再使用 if-else 块了!结合使用策略和工厂模式

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-19 06:08:31722浏览

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

当我们在项目中前进时,迷失在 if-else 块中,在复杂的条件和重复的代码中挣扎,我们寻找解决方案。但为什么我们要陷入 if-else 块中呢?在这篇文章中,让我们结合策略模式和工厂模式来探索摆脱 if-else 混乱的方法。

问题:If-Else 混淆

假设您正在开发一个电子商务应用程序,并且需要支持不同的支付方式,例如信用卡、借记卡和加密货币。您从 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())));
    }
}

在此阶段,通过通用接口实现每种支付方式的单独策略。现在,通过工厂模式,我们将决定选择哪种策略。

第二步:选择工厂模式的策略

在这一步中,我们可以使用 EnumMap 使工厂模式更加简洁和优化。

public class PaymentFactory {
    private static final Map<PaymentType, PaymentStrategy> 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 块来进行支付处理。感谢策略和工厂模式,我们的代码更加干净、模块化和可扩展。

为什么我们应该使用这种模式?

1。可扩展性:添加新的支付方式只需要一个新类和几行代码。
2.可读性:通过使用策略和工厂而不是 if-else 块,可以使代码更易于理解和管理。
3.可维护性:通过策略和工厂模式,可以在不影响其他代码的情况下对代码进行更改。

结论:从混乱到清晰

如果您正在开发一个不断增长的项目,则不应使用 if-else 块。策略和工厂模式是让你的代码更简洁、模块化和可维护的完美解决方案。

正如您在本文中所看到的,使用设计模式而不是 if-else 块来管理支付交易使项目更具可开发性,并提高了代码的可读性。在您的下一个项目中尝试这些模式,而不是使用 if-else 块。

...

感谢您阅读我的文章!如果您有任何问题、反馈或想法想要分享,我很乐意在评论中听到它们。

您可以在 dev.to 上关注我,以获取有关此主题和我的其他帖子的更多信息。

谢谢!?‍??

在 LinkedIn 上关注我:https://www.linkedin.com/in/tamerardal/
Medium:不要再使用 if-else 块了!一起使用策略和工厂模式

以上是不要再使用 if-else 块了!结合使用策略和工厂模式的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn