编程设计模式之策略模式

编程设计模式之策略模式

为什么有策略模式?

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

策略模式的设计思路

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

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

  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工程中,我们可以方便地根据需要选择不同的折扣策略,而不需要修改原有的业务逻辑代码。

相关推荐
易协同低代码23 分钟前
通达OA核心类库TD类深度解析
后端
Gopher_HBo25 分钟前
Go语言学习笔记(十八)Gin处理Session
后端
谭光志1 小时前
工具塞满上下文窗口怎么办?深度拆解 AI Agent Tool Search 按需加载实现原理
前端·后端·ai编程
她说..1 小时前
Java 默认值设置方式
java·开发语言·后端·springboot
foggyprojects1 小时前
从0开始,一句话启动AI DataAgent
后端·数据分析·ai编程
郡杰1 小时前
一些基础和问题解决
后端
陈随易2 小时前
前端项目部署只要30秒
前端·后端·程序员
YIAN2 小时前
从零手写文件读取 MCP 服务:一文吃透 Model Context Protocol 全链路通信原理
前端·后端·mcp
Imchendiana2 小时前
《狂人日记NO.9》— 前后端一把梭,我的全栈实录
前端·后端
学渣超2 小时前
记一次分布式事务数据不一致的排查之旅:从超时到索引,层层剥茧
java·后端·架构