编程设计模式之策略模式

编程设计模式之策略模式

为什么有策略模式?

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

策略模式的设计思路

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

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

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

相关推荐
小灰灰搞电子8 分钟前
Rust Slint实现控件尺寸的扩展与收缩源码分享
开发语言·后端·rust
天天摸鱼的java工程师9 分钟前
八年 Java 开发手敲:SpringBoot+SpringSecurity+JWT 实战,前后分离权限注解落地就能跑
java·后端
qianbailiulimeng16 分钟前
IDEA + Spring Boot 的三种热加载方案
java·后端
王元_SmallA16 分钟前
网卡驱动架构以及源码分析
java·后端
八苦21 分钟前
实现 json path 来评估函数式解析器的损耗
后端
山河亦问安1 小时前
Spring Boot异步接口性能优化:从单线程到高并发的优化历程
spring boot·后端·性能优化
DoubleKK1 小时前
Python 玩转 MCP:在工具函数中获取请求 Headers 的正确姿势
后端
调试人生的显微镜1 小时前
深入理解 iOS 16/17/18/26 描述文件管理:多工具协同下的配置与调试新思路
后端
一 乐2 小时前
个人理财系统|基于java+小程序+APP的个人理财系统设计与实现(源码+数据库+文档)
java·前端·数据库·vue.js·后端·小程序
盖世英雄酱581362 小时前
java深度调试技术【第四五章:多线程和幽灵代码】
java·后端