当我们在项目中前进时,迷失在 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 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 块来进行支付处理。感谢策略和工厂模式,我们的代码更加干净、模块化和可扩展。
1。可扩展性:添加新的支付方式只需要一个新类和几行代码。
2.可读性: 通过使用策略和工厂而不是 if-else 块,可以使代码更易于理解和管理。
3.可维护性:通过策略和工厂模式,可以在不影响其他代码的情况下对代码进行更改。
如果您正在开发一个不断增长的项目,则不应使用 if-else 块。策略和工厂模式是使您的代码更清晰、模块化和可维护的完美解决方案。
正如您在本文中所看到的,使用设计模式而不是 if-else 块来管理支付交易使项目更具可开发性,并提高了代码的可读性。在下一个项目中尝试这些模式,而不是使用 if-else 块。
...
感谢您阅读我的文章!如果您有任何问题、反馈或想法想要分享,我很乐意在评论中听到它们。
您可以在 dev.to 上关注我,以获取有关此主题和我的其他帖子的更多信息。
谢谢你??
在 LinkedIn 上关注我:https://www.linkedin.com/in/tamerardal/
Medium:不要再使用 if-else 块了!策略和工厂模式结合使用
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3