# 策略模式

# 概念

策略模式属于行为型设计模式,通过定义一系列算法(策略),将每个算法封装成独立类,并使它们可以互相替换。这种模式让算法的变化独立于使用它的客户端,提升灵活性和可维护性。

# 作用

1.消除冗长的条件分支语句(如 if-else 或 switch)。

2.提高代码扩展性,新增策略无需修改现有代码(符合开闭原则)。

# 场景

1.系统需要支持多种支付方式(微信、支付宝、银联),不同支付方式的处理逻辑不同。

# 举例

以下是使用策略模式实现多支付方式的Java代码示例:

// 策略接口
public interface PaymentStrategy {
    void pay(String orderId, double amount);
}
// 微信支付策略
public class WechatPayStrategy implements PaymentStrategy {
    @Override
    public void pay(String orderId, double amount) {
        System.out.println("微信支付: 订单" + orderId + " 支付金额" + amount);
    }
}
// 支付宝支付策略
public class AlipayStrategy implements PaymentStrategy {
    @Override
    public void pay(String orderId, double amount) {
        System.out.println("支付宝支付: 订单" + orderId + " 支付金额" + amount);
    }
}
// 银联支付策略
public class UnionPayStrategy implements PaymentStrategy {
    @Override
    public void pay(String orderId, double amount) {
        System.out.println("银联支付: 订单" + orderId + " 支付金额" + amount);
    }
}
// 上下文类(封装策略)
public class PaymentContext {
    private PaymentStrategy strategy;

    public void setStrategy(PaymentStrategy strategy) {
        this.strategy = strategy;
    }

    public void executePayment(String orderId, double amount) {
        strategy.pay(orderId, amount);
    }
}

客户端调用:

public class Client {
    public static void main(String[] args) {
        PaymentContext context = new PaymentContext();

        // 微信支付
        context.setStrategy(new WechatPayStrategy());
        context.executePayment("ORDER_001", 100.0);

        // 支付宝支付
        context.setStrategy(new AlipayStrategy());
        context.executePayment("ORDER_002", 200.0);

        // 银联支付
        context.setStrategy(new UnionPayStrategy());
        context.executePayment("ORDER_003", 300.0);
    }
}

# 反例

不使用策略模式时,通常通过条件分支语句处理多支付方式:

public class PaymentService {
    public void pay(String type, String orderId, double amount) {
        if ("wechat".equals(type)) {
            System.out.println("微信支付: 订单" + orderId + " 支付金额" + amount);
        } else if ("alipay".equals(type)) {
            System.out.println("支付宝支付: 订单" + orderId + " 支付金额" + amount);
        } else if ("unionpay".equals(type)) {
            System.out.println("银联支付: 订单" + orderId + " 支付金额" + amount);
        } else {
            throw new IllegalArgumentException("不支持的支付方式");
        }
    }
}

问题分析:

1.违反开闭原则:新增支付方式需修改pay方法,增加else if分支。

2.代码臃肿:逻辑集中在一个类中,难以维护。

3.复用性差:相同支付逻辑无法被其他模块复用。

# 原理

策略模式通过定义策略接口,将不同的算法封装到具体的策略类中。上下文类持有策略接口的引用,客户端通过设置不同的策略实例来动态切换算法。这种设计将算法的实现与使用分离,使得算法的变化不会影响客户端代码,同时避免了大量的条件判断语句。

# 缺点

1.策略类数量可能过多,增加系统复杂度。

2.客户端需要了解不同策略之间的差异,以便选择合适的策略。

总结

策略模式通过将算法封装为独立对象,实现了逻辑解耦和动态切换,显著提升了代码的灵活性和可维护性。在支付场景中,它完美支持多支付方式的扩展,避免了传统实现中的条件分支陷阱。若系统存在类似“多算法变体”需求,策略模式是理想选择。



微信公众号

QQ交流群
原创网站开发,偏差难以避免。

如若发现错误,诚心感谢反馈。

愿你倾心相念,愿你学有所成。

愿你朝华相顾,愿你前程似锦。