设计模式——策略模式的实践和应用(下)

我们在上一篇中简单介绍了策略设计模式,相信大家对策略设计模式大致了解了,但是如何在项目中去使用呢?这是好多人的问题,东西一学就会,一用就一篇空白,今天,我就介绍一下策略设计模式在实际中的运用。

工欲善其事必先利其器,如果还不了解策略设计模式的,可以先学习一下策略设计模式

设计模式——策略模式的实践和应用(上)

在生活中,我们也常常会遇到类似的情况,实现某一个功能有多种方法,每种方法对应一种算法,此时我们可以使用一种设计模式来实现不同的解决方案,同时也利于后期扩展,这就是今天要介绍的策略设计模式。

我们先来看一下几个场景:

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;
    }
}

随着业务的扩展,后期的浏览历史、热卖推荐、浏览记录、我的收藏,都是一样的逻辑,改造完成后,大大方便了以后的扩展和维护。

使用策略模式对商品推荐进行优化,只是优化的第一步,还不是最后的实现,未完待续。。。

 

代码地址:

稍后贴上

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值