编程设计模式之策略模式

编程设计模式之策略模式

为什么有策略模式?

在软件开发中,经常会遇到需要根据不同的条件来选择不同的算法或行为的情况。如果每次都直接在代码中写入各种条件分支,会导致代码的复杂度增加,可维护性降低,并且不利于后续的扩展和维护。策略模式正是为了解决这一问题而诞生的。

策略模式的设计思路

策略模式的核心思想是定义一系列的算法,将每个算法封装起来,并使它们可以互相替换。这样,客户端就可以根据需要选择不同的算法,而不必关心算法的具体实现。

策略模式包含三个主要角色:

  1. Context(环境类):用于维护对策略对象的引用,并且负责将客户端的请求委托给策略对象来执行。
  2. Strategy(策略接口):定义了所有支持的算法的公共接口。它可以是抽象类,也可以是接口,具体实现类则封装了具体的算法。
  3. ConcreteStrategy(具体策略类):实现了策略接口,提供具体的算法实现。

Java示例代码

下面是一个简单的Java示例代码,演示了策略模式的应用:

java 复制代码
// 策略接口
interface Strategy {
    void execute();
}

// 具体策略类A
class ConcreteStrategyA implements Strategy {
    @Override
    public void execute() {
        System.out.println("执行策略A");
    }
}

// 具体策略类B
class ConcreteStrategyB implements Strategy {
    @Override
    public void execute() {
        System.out.println("执行策略B");
    }
}

// 环境类
class Context {
    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

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

    public void executeStrategy() {
        strategy.execute();
    }
}

// 客户端代码
public class Main {
    public static void main(String[] args) {
        // 创建具体策略对象
        Strategy strategyA = new ConcreteStrategyA();
        Strategy strategyB = new ConcreteStrategyB();

        // 创建环境对象,并设置具体策略对象
        Context context = new Context(strategyA);

        // 执行策略
        context.executeStrategy();

        // 切换策略
        context.setStrategy(strategyB);
        context.executeStrategy();
    }
}

SpringBoot工程中如何应用策略模式

在SpringBoot工程中,我们可以使用策略模式来实现某些业务逻辑的动态选择,例如根据用户的VIP等级来计算折扣。以下是一个简单的示例:

首先,定义策略接口:

java 复制代码
// 折扣策略接口
public interface DiscountStrategy {
    double applyDiscount(double amount);
}

然后,实现具体的折扣策略:

java 复制代码
// 普通会员折扣策略
@Component
public class RegularDiscountStrategy implements DiscountStrategy {
    @Override
    public double applyDiscount(double amount) {
        return amount * 0.9; // 九折
    }
}

// VIP会员折扣策略
@Component
public class VipDiscountStrategy implements DiscountStrategy {
    @Override
    public double applyDiscount(double amount) {
        return amount * 0.8; // 八折
    }
}

最后,在需要使用折扣的地方,通过Spring的依赖注入来动态选择策略:

java 复制代码
@Service
public class CheckoutService {
    private final DiscountStrategy discountStrategy;

    @Autowired
    public CheckoutService(DiscountStrategy discountStrategy) {
        this.discountStrategy = discountStrategy;
    }

    public double calculateTotal(double amount) {
        return discountStrategy.applyDiscount(amount);
    }
}

通过这种方式,在SpringBoot工程中,我们可以方便地根据需要选择不同的折扣策略,而不需要修改原有的业务逻辑代码。

相关推荐
用户60830892904726 分钟前
集合处理利器,Java中的Stream流API
java·后端
Doris_202326 分钟前
Python条件判断语句 if、elif 、else
前端·后端·python
9号达人29 分钟前
Java 14 新特性详解与实践
java·后端·面试
Doris_202331 分钟前
Python 模式匹配match case
前端·后端·python
ytadpole31 分钟前
揭秘XXL-JOB:Bean、GLUE 与脚本模式的底层奥秘
java·后端
shark_chili1 小时前
计算机磁盘的奥秘:从硬件构造到操作系统管理
后端
这里有鱼汤1 小时前
Python量化实盘踩坑指南:分钟K线没处理好,小心直接亏钱!
后端·python·程序员
这里有鱼汤1 小时前
分享一个实用的主力抄底的“三合一指标”:主力吸货 + 风险 + 趋势
后端
IT_陈寒2 小时前
React性能优化:这5个Hook技巧让我的组件渲染效率提升50%(附代码对比)
前端·人工智能·后端