策略模式:优雅重构,告别繁琐的if-else迷宫

33 阅读3分钟

在软件开发的世界里,随着业务逻辑的日益复杂,代码中的if-else语句往往会像野草般疯长,不仅让代码变得难以维护,还大大降低了程序的可读性和可扩展性。这时,策略模式(Strategy Pattern)就像一位智慧的园艺师,帮助我们修剪掉这些冗余的if-else,让代码重新焕发生机与活力。本文将通过一个具体例子,带你领略策略模式的魅力,让你与繁琐的if-else迷宫说拜拜。

什么是策略模式?

策略模式是一种行为型设计模式,它定义了一系列算法,并将每一种算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户。简言之,策略模式允许你在运行时选择算法的行为。

场景设定

假设我们正在开发一个电商平台的支付系统,该平台支持多种支付方式,如支付宝、微信支付、银行卡支付等。每种支付方式都有其独特的处理逻辑,如调用不同的API、处理不同的支付结果等。如果采用传统的if-else方式来实现,代码可能会变成这样:

public class PaymentService {
    public void pay(String paymentType, Order order) {
        if ("alipay".equals(paymentType)) {
            // 支付宝支付逻辑
        } else if ("wechat".equals(paymentType)) {
            // 微信支付逻辑
        } else if ("bankcard".equals(paymentType)) {
            // 银行卡支付逻辑
        } else {
            throw new IllegalArgumentException("Unsupported payment type");
        }
    }
}

这样的代码不仅难以维护,每次新增支付方式时都需要修改pay方法,违反了开闭原则(对扩展开放,对修改关闭)。

策略模式重构

接下来,我们使用策略模式来重构上述代码。首先,定义一个支付策略的接口:

public interface PaymentStrategy {
    void pay(Order order);
}

然后,为每种支付方式实现具体的策略类:

public class AlipayStrategy implements PaymentStrategy {
    @Override
    public void pay(Order order) {
        // 支付宝支付逻辑
        System.out.println("Paying with Alipay for order: " + order.getId());
    }
}

public class WechatStrategy implements PaymentStrategy {
    @Override
    public void pay(Order order) {
        // 微信支付逻辑
        System.out.println("Paying with Wechat for order: " + order.getId());
    }
}

// 类似地,可以为银行卡支付等实现其他策略类

最后,修改PaymentService类,使其能够根据不同的支付类型选择相应的策略:

import java.util.HashMap;
import java.util.Map;

public class PaymentService {
    private Map<String, PaymentStrategy> strategies = new HashMap<>();

    public PaymentService() {
        strategies.put("alipay", new AlipayStrategy());
        strategies.put("wechat", new WechatStrategy());
        // 初始化其他支付策略
    }

    public void pay(String paymentType, Order order) {
        PaymentStrategy strategy = strategies.get(paymentType);
        if (strategy == null) {
            throw new IllegalArgumentException("Unsupported payment type");
        }
        strategy.pay(order);
    }
}

现在,每当需要新增一种支付方式时,我们只需新增一个策略类,并在PaymentService的构造函数中注册它,而无需修改pay方法的逻辑。这样,不仅保持了代码的清晰和可扩展性,还避免了if-else的噩梦。

结语

策略模式以其优雅的设计哲学,为我们提供了一种有效管理多种算法或行为的方式。通过策略模式,我们可以轻松地将算法与客户端代码分离,提高代码的灵活性和可维护性。正如你所见,与繁琐的if-else迷宫说拜拜,其实并不难。