编程设计模式之策略模式

编程设计模式之策略模式

为什么有策略模式?

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

策略模式的设计思路

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

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

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

相关推荐
Asthenia0412几秒前
Spring事件机制:微服务架构下的子服务内部解耦合/多场景代码分析
后端
Asthenia041214 分钟前
面试官问我:Spring AOP的代理模式与实现原理深度剖析
后端
小马爱打代码26 分钟前
Spring Boot - 实现邮件发送
spring boot·后端
褚翾澜28 分钟前
Ruby语言的代码重构
开发语言·后端·golang
你的人类朋友1 小时前
浅谈Object.prototype.hasOwnProperty.call(a, b)
javascript·后端·node.js
仙灵灵2 小时前
前端的同学看过来,今天讲讲jwt登录
前端·后端·程序员
Home2 小时前
一、Java性能优化--Nginx篇(一)
后端
陈随易2 小时前
VSCode v1.99发布,王者归来,Agent和MCP正式推出
前端·后端·程序员
ShooterJ2 小时前
海量序列号的高效处理方案
后端
你的人类朋友2 小时前
CommonJS模块化规范
javascript·后端·node.js