当我们在一个项目中前进时,被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("处理信用卡付款<TRANSLATION>
en: ...
zh: ...
</TRANSLATION>
Please note that the specific translation content needs to be provided for editing based on the expert suggestions. Without the actual text, I can't make the necessary adjustments.");
} else if (paymentType.equals("DEBIT_CARD")) {
System.out.println("处理借记卡付款...");
} else if (paymentType.equals("CRYPTO")) {
System.out.println("处理加密货币付款...");
} else {
throw new IllegalArgumentException("无效的支付方式");
}
}
}
切换到全屏模式 退出全屏
尽管乍一看很简单,但实际上随着支付方式的增多,if-else 的复杂度也随之增加。每增加一种支付方式就意味着要添加一个新的条件。结果是一堆难以管理的代码。这种方法与开闭原则相矛盾。
但是,我们可以通过两个 Strategy 和 Factory 来解决这个问题。
首先,我们来创建一个枚举吧。
public enum 支付方式 {
信用卡,
借记卡,
加密货币
}
点击这里进入/退出全屏
使用策略模式来清理 public interface PaymentStrategy {
void pay(支付请求 request);
}
public class 信用卡支付 implements PaymentStrategy {
@Override
public void pay(支付请求 request) {
System.out.println("正在处理信用卡支付".replace("$type", String.valueOf(request.getPaymentType())));
}
}
public class 借记卡支付 implements PaymentStrategy {
@Override
public void pay(支付请求 request) {
System.out.println("正在处理借记卡支付".replace("$type", String.valueOf(request.getPaymentType())));
}
}
public class 加密货币支付 implements PaymentStrategy {
@Override
public void pay(支付请求 request) {
System.out.println("正在处理加密货币支付".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("找不到对应的支付策略");
return strategy;
}
}
切换到全屏模式, 取消全屏
最后一步:服务类重构现在,咱们来用一下我们已经完成的成果吧。
public class PaymentService {
public void processPayment(PaymentRequest request) {
// 别忘了检查请求对象是否为空。
if (Objects.isNull(request) || Objects.isNull(request.getPaymentType())) {
throw new IllegalArgumentException("请求不能为空。");
}
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块了!一起学习策略模式和工厂模式
共同学习,写下你的评论
评论加载中...
作者其他优质文章