news 2026/10/24 9:15:17

使用模板模式+策略模式实现产品推荐

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用模板模式+策略模式实现产品推荐

一、实现思路

  • 模板方法:固定推荐流程

  • 策略模式:听阈规则 / 价格规则可替换

二、整体设计结构

AbstractProductRecommendTemplate ↓ filterByThreshold() ← 策略① ↓ groupByBrand() ↓ selectByPriceLevel() ← 策略② ↓ buildResult()

三、第一步:定义“推荐模板”(流程写死)

public abstract class AbstractProductRecommendTemplate { public final List<Product> recommend(List<Product> products, UserProfile user) { // 1、 听阈过滤(最关键) List<Product> available = filterByThreshold(products, user); if (available.isEmpty()) { return Collections.emptyList(); } // 2、 按品牌分组 Map<String, List<Product>> brandMap = groupByBrand(available); // 3、 每个品牌选高 / 中 / 低 3种价格的产品,对应不同价格需求的用户群体 return selectByPriceLevel(brandMap, user); } protected abstract List<Product> filterByThreshold( List<Product> products, UserProfile user); protected Map<String, List<Product>> groupByBrand(List<Product> products) { return products.stream() .collect(Collectors.groupingBy(Product::getBrand)); } protected abstract List<Product> selectByPriceLevel( Map<String, List<Product>> brandMap, UserProfile user); }

四、第二步:听阈匹配策略

1、 策略接口

public interface ThresholdMatchStrategy { boolean match(Product product, UserProfile user); }

2、实现类

@Component("DEFAULT_THRESHOLD") public class DefaultThresholdStrategy implements ThresholdMatchStrategy { @Override public boolean match(Product p, UserProfile user) { return p.getMinHz() <= user.getMinHz() && p.getMaxHz() >= user.getMaxHz(); } }

五、第三步:价格选择策略

1、 策略接口

public interface PriceSelectStrategy { List<Product> select(List<Product> products); }

2、 高 / 中 / 低 价格策略

@Component("HIGH_MID_LOW") public class HighMidLowPriceStrategy implements PriceSelectStrategy { @Override public List<Product> select(List<Product> products) { if (products.size() <= 3) { return products; } products.sort(Comparator.comparing(Product::getPrice)); Product low = products.get(0); Product mid = products.get(products.size() / 2); Product high = products.get(products.size() - 1); return List.of(low, mid, high); } }

六、模板的实现类组合使用上面的2个策略

@Autowired private ThresholdMatchStrategy thresholdStrategy; @Autowired private PriceSelectStrategy priceSelectStrategy; @Override protected List<Product> filterByThreshold(List<Product> products, UserProfile user) { return products.stream() .filter(p -> thresholdStrategy.match(p, user)) .collect(Collectors.toList()); } @Override protected List<Product> selectByPriceLevel( Map<String, List<Product>> brandMap, UserProfile user) { List<Product> result = new ArrayList<>(); brandMap.forEach((brand, list) -> { result.addAll(priceSelectStrategy.select(list)); }); return result; }

七、Controller / Service 使用方式

@Autowired private ProductRecommendService recommendService; public List<Product> recommend(Long userId) { UserProfile user = userService.getProfile(userId); List<Product> products = productRepository.findAll(); return recommendService.recommend(products, user); }

这套设计特别适用于以下场景:

  • 听力产品推荐

  • 活动商品推荐

  • 套餐组合

  • 分档定价

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/24 5:15:00

GUVA-S12SD UV紫外线传感器原理图设计,已量产(光线传感器)

目录 1、传感器的工作回路设计 2、运放的缓冲与滤波设计 3、实际应用的注意点 在户外便携式设备、环境监测节点这类嵌入式应用中,紫外线强度检测是很常见的功能需求。选对传感器和配套电路,既能控制成本,又能保证检测稳定性 ——GUVA-S12SD 就是个不错的选择,它不用额外…

作者头像 李华
网站建设 2026/10/24 7:47:35

authfwcfg.dll文件丢失找不到 打不开问题 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/10/21 13:55:52

2026年大模型学习路线图 | 四大方向+避坑指南,助你顺利转行0_基础能不能转大模型?到底怎么转?

文章分析了2025年普通人转向大模型领域的路径&#xff0c;指出大模型是一个包含应用层、模型层、训练链路等多层技术体系&#xff0c;而非仅是ChatGPT。文章揭示了新人常见误区&#xff0c;详细介绍了数据、平台、应用、部署四大方向及其适合人群&#xff0c;并提供了分阶段学习…

作者头像 李华
网站建设 2026/10/23 3:58:49

FrankenPHP实践

目录 1. 说明 2. 程序修改 3. 性能测试 4. 配置 4.1 Docker化部署 4.2 Caddy泛域名和证书设置 4.3 相关命令 5. 要点&#xff1a; 6. 参考 1. 说明 Frankenphp是一个先进的&#xff0c;结合了高性能Caddy服务器的PHP环境框架&#xff0c;它允许用户只需要少量改动&am…

作者头像 李华
网站建设 2026/10/22 22:39:05

深入解析DDR内存原理、测试方法及在嵌入式系统中的应用

文章目录摘要1. DDR内存核心技术解析1.1 物理架构与存储原理1.2 关键时序参数2. DDR测试方法与工具链2.1 测试环境搭建2.2 MemTest86测试流程3. 嵌入式系统集成实践3.1 ARM Cortex-A内存控制器配置4. 完整测试代码实现5. 常见问题解决5.1 信号完整性问题6. 成果展示技术图谱摘要…

作者头像 李华