为了账号安全,请及时绑定邮箱和手机立即绑定

别再使用if-else语句了!一起使用这两种设计模式——策略模式和工厂模式的方法,告别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("处理信用卡付款<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块了!一起学习策略模式和工厂模式

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消