侧边栏壁纸
博主头像
拾荒的小海螺博主等级

只有想不到的,没有做不到的

  • 累计撰写 224 篇文章
  • 累计创建 19 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

JAVA:策略模式(Strategy Pattern)的技术指南

拾荒的小海螺
2025-03-11 / 0 评论 / 0 点赞 / 15 阅读 / 4693 字

1、简述

策略模式(Strategy Pattern)是一种行为型设计模式,旨在定义一系列算法,并将它们封装起来,使它们可以互相替换。这种模式让算法的变化不会影响到使用算法的客户端。

设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git

本文将详细介绍策略模式的概念、结构、优缺点及实际应用案例。

image-wmxt.png


2、什么是策略模式?

策略模式是将不同的算法封装到独立的类中,使其可以相互替换而不影响使用它的客户端代码。它的主要特点是:

  • 封装变化:可以在不修改客户端代码的情况下更改算法。
  • 开放/关闭原则:通过增加新策略来扩展功能,而不是修改已有代码。

策略模式包含以下三个核心角色:

  • 上下文(Context):持有对策略对象的引用。
  • 抽象策略(Strategy):定义所有支持的算法的公共接口。
  • 具体策略(ConcreteStrategy):实现具体的算法。

类图如下:

Context ----> Strategy
                  ^
                  |
     ConcreteStrategyA, ConcreteStrategyB

3、实际案例

假设一个电商系统需要支持多种支付方式,如支付宝、微信支付和信用卡支付。我们可以使用策略模式来实现。

// 抽象策略接口
public interface PaymentStrategy {
    void pay(int amount);
}

// 具体策略:支付宝支付
public class AlipayStrategy implements PaymentStrategy {
    @Override
    public void pay(int amount) {
        System.out.println("使用支付宝支付: " + amount + " 元");
    }
}

// 具体策略:微信支付
public class WeChatPayStrategy implements PaymentStrategy {
    @Override
    public void pay(int amount) {
        System.out.println("使用微信支付: " + amount + " 元");
    }
}

// 具体策略:信用卡支付
public class CreditCardStrategy implements PaymentStrategy {
    private String cardNumber;

    public CreditCardStrategy(String cardNumber) {
        this.cardNumber = cardNumber;
    }

    @Override
    public void pay(int amount) {
        System.out.println("使用信用卡支付: " + amount + " 元,卡号: " + cardNumber);
    }
}

// 上下文类
public class PaymentContext {
    private PaymentStrategy paymentStrategy;

    // 设置支付策略
    public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    // 执行支付
    public void pay(int amount) {
        if (paymentStrategy == null) {
            System.out.println("请先设置支付方式!");
        } else {
            paymentStrategy.pay(amount);
        }
    }
}

// 测试类
public class StrategyPatternDemo {
    public static void main(String[] args) {
        PaymentContext context = new PaymentContext();

        // 使用支付宝支付
        context.setPaymentStrategy(new AlipayStrategy());
        context.pay(500);

        // 使用微信支付
        context.setPaymentStrategy(new WeChatPayStrategy());
        context.pay(300);

        // 使用信用卡支付
        context.setPaymentStrategy(new CreditCardStrategy("1234-5678-9012-3456"));
        context.pay(800);
    }
}

输出:

使用支付宝支付: 500 元
使用微信支付: 300 元
使用信用卡支付: 800 元,卡号: 1234-5678-9012-3456

4、策略模式的优缺点

优点

  • 算法独立:每个策略封装在独立的类中,可以自由扩展和复用。
  • 符合开闭原则:可以增加新策略而不影响现有代码。
  • 简化代码:消除了使用条件语句选择算法的需求。

缺点

  • 类数量增加:每个策略需要一个独立的类,可能会导致类数量增加。
  • 上下文需要了解策略:客户端需要知道所有策略并选择适合的策略。

5、应用场景

  • 多种算法替换场景:如排序算法(快速排序、冒泡排序等)。
  • 需要灵活选择算法时:如支付方式、促销规则。
  • 避免使用条件语句:将复杂的条件判断逻辑替换为策略模式。

6、总结

策略模式通过封装算法的变化,将不同的策略算法解耦,为系统提供了很好的扩展性。通过实际应用,如支付系统的实现,能够直观地感受到策略模式在简化代码、提高可维护性方面的价值。

希望本文对您理解和使用策略模式有所帮助!欢迎交流讨论!

0

评论区