策略模式(Strategy Pattern)是行为设计模式之一,它能够定义一系列算法,并将每一个算法封装起来,使它们可以互换。这种模式使得算法可以独立于使用它的客户端(客户代码)而变化。在Spring Boot应用中,策略模式常用于根据某些条件(如ID、类型等)动态选择不同的服务实现。
本文将介绍如何在Spring Boot中基于ID选择不同服务类,实现策略模式。我们会通过一个简单的示例来演示这一过程。
假设我们有一个电商系统,不同的用户等级(如普通用户、VIP用户、超级VIP用户)享有不同的折扣策略。我们需要根据用户等级ID动态选择相应的折扣计算服务。
首先,我们需要定义一个策略接口,所有具体的折扣策略类都需要实现这个接口。
package com.example.strategy;
public interface DiscountStrategy {
double calculateDiscount(double price);
}
接下来,我们实现几个具体的折扣策略类,如普通用户折扣、VIP用户折扣和超级VIP用户折扣。
package com.example.strategy.impl;
import com.example.strategy.DiscountStrategy;
import org.springframework.stereotype.Service;
@Service("RegularDiscount")
public class RegularDiscount implements DiscountStrategy {
@Override
public double calculateDiscount(double price) {
return price; // 无折扣
}
}
@Service("VipDiscount")
public class VipDiscount implements DiscountStrategy {
@Override
public double calculateDiscount(double price) {
return price * 0.9; // 9折
}
}
@Service("SuperVipDiscount")
public class SuperVipDiscount implements DiscountStrategy {
@Override
public double calculateDiscount(double price) {
return price * 0.8; // 8折
}
}
为了方便根据用户等级ID动态选择折扣策略,我们创建一个策略工厂。
package com.example.factory;
import com.example.strategy.DiscountStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component
public class DiscountStrategyFactory {
private static final Map<String, String> STRATEGY_MAP = new HashMap<>();
static {
STRATEGY_MAP.put("1", "RegularDiscount");
STRATEGY_MAP.put("2", "VipDiscount");
STRATEGY_MAP.put("3", "SuperVipDiscount");
}
@Autowired
private ApplicationContext applicationContext;
public DiscountStrategy getStrategyById(String id) {
String beanName = STRATEGY_MAP.get(id);
if (beanName == null) {
throw new IllegalArgumentException("No such strategy for id: " + id);
}
return (DiscountStrategy) applicationContext.getBean(beanName);
}
}
最后,我们在Controller中使用策略工厂,根据用户等级ID动态选择折扣策略。
package com.example.controller;
import com.example.factory.DiscountStrategyFactory;
import com.example.strategy.DiscountStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DiscountController {
@Autowired
private DiscountStrategyFactory discountStrategyFactory;
@GetMapping("/discount")
public double getDiscount(@RequestParam String userId, @RequestParam double price) {
// 假设这里从数据库或其他地方获取用户等级ID
// 为简化演示,这里直接假设用户ID即为等级ID
String userLevelId = userId;
DiscountStrategy discountStrategy = discountStrategyFactory.getStrategyById(userLevelId);
return discountStrategy.calculateDiscount(price);
}
}
启动Spring Boot应用,访问如下URL进行测试:
http://localhost:8080/discount?userId=1&price=100
http://localhost:8080/discount?userId=2&price=100
http://localhost:8080/discount?userId=3&price=100
根据userId的不同,你会得到不同的折扣结果。
本文介绍了如何在Spring Boot中基于ID选择不同服务类,实现策略模式。通过定义策略接口、实现具体策略类、创建策略工厂和在Controller中使用策略,我们实现了一个简单而灵活的策略模式应用。这种设计模式使得我们的代码更具扩展性和可维护性,可以根据需求动态增加新的策略而无需修改现有代码。
原文作者:后端Q;如有侵权,请联系管理员删除。