别再用 if-else 语句了!策略模式和工厂模式结合使用
在项目推进过程中,我们常常迷失在 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 代码块了!策略模式和工厂模式结合使用