我们在上一篇中简单介绍了策略设计模式,相信大家对策略设计模式大致了解了,但是如何在项目中去使用呢?这是好多人的问题,东西一学就会,一用就一篇空白,今天,我就介绍一下策略设计模式在实际中的运用。
工欲善其事必先利其器,如果还不了解策略设计模式的,可以先学习一下策略设计模式
在生活中,我们也常常会遇到类似的情况,实现某一个功能有多种方法,每种方法对应一种算法,此时我们可以使用一种设计模式来实现不同的解决方案,同时也利于后期扩展,这就是今天要介绍的策略设计模式。
我们先来看一下几个场景:
1、我们在网上购物时,有些商品参与了促销活动,可以用不同的优惠券,有的促销活动是二件九折,三件八折等等,有不同的优惠。
2、网上选完商品,提交订单的时候,我们会看到有不同的支付方式,比如支付宝、微信、白条等等,我们选择不同的支付方式完成支付
对于这些场景,用策略设计模式确实是一个不错的选择,方便以后的扩展和维护。
在商城,有几个商品推荐场景,今天,我给大家分享一下我们系统的策略模式场景
首页-猜你会买 ——————————————————————————————————————————
详情页-热门推荐 ——————————————————————————————————————————
购物车-猜你喜欢 ——————————————————————————————————————————
在不同的场景中 ,有不同的推荐方案,在之前的代码中,都是通过if判断,来获取不同数据源,随着推荐的场景越来多,if判断显得比较臃肿
本次我们基于策略模式对商品推荐业务进行优化
我们先定义一个商品推荐策略接口:
public interface ItemRecommendService {
/**
* 商品推荐接口
* @param itemDTO
*/
List<ItemEntity> recommend(ItemDTO itemDTO);
}
基于商品推荐接口,三种场景首页-猜你会买、详情页-热门推荐、购物车-猜你喜欢,不同的实现策略
首页-猜你会买
@Service
public class GuessYouBuyServiceImpl implements ItemRecommendService {
@Override
public List<ItemEntity> recommend(ItemDTO itemDTO) {
// 从猜你会买表获取的数据
List<ItemEntity> itemList = new ArrayList<>();
ItemEntity itemEntity = new ItemEntity();
itemEntity.setCommodityName("猜你会买商品");
itemList.add(itemEntity);
return itemList;
}
}
详情页-热门推荐
@Service
public class PopularRecommendServiceImpl implements ItemRecommendService {
@Override
public List<ItemEntity> recommend(ItemDTO itemDTO) {
// 从热门推荐表获取的数据
List<ItemEntity> itemList = new ArrayList<>();
ItemEntity itemEntity = new ItemEntity();
itemEntity.setCommodityName("热门推荐商品");
itemList.add(itemEntity);
return itemList;
}
}
购物车-猜你喜欢
@Service
public class GuessYouLikeServiceImpl implements ItemRecommendService {
@Override
public List<ItemEntity> recommend(ItemDTO itemDTO) {
// 从猜你喜欢表获取的数据
List<ItemEntity> itemList = new ArrayList<>();
ItemEntity itemEntity = new ItemEntity();
itemEntity.setCommodityName("猜你喜欢商品");
itemList.add(itemEntity);
return itemList;
}
推荐商品上下文
public class ItemRecommendContext {
private ItemRecommendService itemRecommendService;
private ItemDTO itemDTO;
public ItemRecommendContext(ItemRecommendService itemRecommendService, ItemDTO itemDTO){
this.itemRecommendService = itemRecommendService;
this.itemDTO= itemDTO;
}
public List<ItemEntity> recommend(){
return itemRecommendService.recommend(itemDTO);
}
}
三种不同的场景,推荐访问Controller
@RestController
@RequestMapping("/itemrecommend")
public class ItemRecommendController {
@Autowired
private GuessYouBuyServiceImpl guessBuyRecommendService;
@Autowired
private PopularRecommendServiceImpl popularRecommendService;
@Autowired
private GuessYouLikeServiceImpl guessListRecommendService;
@RequestMapping("/guessyoubuy")
public List<ItemEntity> guessBuyRecommend(){
ItemDTO itemDTO = new ItemDTO();
ItemRecommendContext itemRecommendContext = new ItemRecommendContext(guessBuyRecommendService,itemDTO);
List<ItemEntity> recommendList = itemRecommendContext.recommend();
return recommendList;
}
@RequestMapping("/popularrecommend")
public List<ItemEntity> guessLikeRecommend(){
ItemDTO itemDTO = new ItemDTO();
ItemRecommendContext itemRecommendContext = new ItemRecommendContext(popularRecommendService,itemDTO);
List<ItemEntity> recommendList = itemRecommendContext.recommend();
return recommendList;
}
@RequestMapping("/guessyoulike")
public List<ItemEntity> detailRecommend(){
ItemDTO itemDTO = new ItemDTO();
ItemRecommendContext itemRecommendContext = new ItemRecommendContext(guessListRecommendService,itemDTO);
List<ItemEntity> recommendList = itemRecommendContext.recommend();
return recommendList;
}
}
随着业务的扩展,后期的浏览历史、热卖推荐、浏览记录、我的收藏,都是一样的逻辑,改造完成后,大大方便了以后的扩展和维护。
使用策略模式对商品推荐进行优化,只是优化的第一步,还不是最后的实现,未完待续。。。
代码地址:
稍后贴上