news 2026/4/19 21:23:14

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

作者头像

张小明

前端开发工程师

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/4/18 10:50:51

idea创建springBoot的五种方式

目录 第一种 第二种 第三种 第四种 第五种 1.先创建一个普通的mavenjava项目 2.pom.xml 3.启动类 4.controller 5.运行访问 第一种 idea直接从spring.io官网下载 https://start.spring.io/ 使用jar包创建就行&#xff0c;也是maven项目&#xff0c;jdk选1.8&#…

作者头像 李华
网站建设 2026/4/18 7:42:15

AS7341可见光谱传感器原理图设计,已量产(光线传感器)

目录 1、电源系统:PAM3101 LDO 的 “稳” 字诀 2、AS7341 核心电路:电平匹配是 I2C 通信的 “生命线” 3、暗光补光:传感器自控制的高亮 LED 电路 4、实际调板的小注意点 最近在做便携式环境光光谱检测项目时,我们基于 ams 的 AS7341 搭了一套硬件电路 —— 这颗芯片算…

作者头像 李华
网站建设 2026/4/17 23:59:08

IDEA + Spring Boot 的三种热加载方案,看完弄懂,不用加班

背景 在日常开发中&#xff0c;我们需要经常修改 Java 代码&#xff0c;手动重启项目&#xff0c;查看修改后的效果。如果在项目小时&#xff0c;重启速度比较快&#xff0c;等待的时间是较短的。但是随着项目逐渐变大&#xff0c;重启的速度变慢&#xff0c;等待时间 1-2 min …

作者头像 李华
网站建设 2026/4/18 8:16:14

AI辅助技术栈健康度评估:优化技术决策

AI辅助技术栈健康度评估:优化技术决策 关键词:AI辅助、技术栈健康度评估、技术决策优化、技术架构、数据驱动决策 摘要:本文聚焦于AI辅助技术栈健康度评估这一关键领域,旨在阐述如何借助AI技术对技术栈的健康状况进行精准评估,进而优化技术决策。首先介绍了相关背景,包括目…

作者头像 李华
网站建设 2026/4/18 1:24:18

httpslocalhostindex 配置的nginx,一刷新就报404了

当你的Nginx配置导致页面刷新时报404错误时&#xff0c;通常是由于以下几个原因造成的&#xff1a; 静态文件路径配置错误&#xff1a;Nginx没有正确地指向静态文件的目录。前端路由问题&#xff1a;如果是SPA&#xff08;单页应用&#xff09;&#xff0c;刷新页面时Nginx没有…

作者头像 李华
网站建设 2026/4/18 12:06:20

go桌面框架Fyne最全api文档

Fyne 是一个 Go 语言的跨平台 GUI 库 相关命令 //全局安装fyne打包工具 go install fyne.io/fyne/v2/cmd/fynelatest// 引入fyne库 go get fyne.io/fyne/v2latest go mod tidy//以窗口形式启动 go run main.go //以手机模拟器形式启动 go run -tags mobile main.go//打包 //桌面…

作者头像 李华