不同方向但同样努力的人,都有自身的价值和亮点,也都是可以互相学习的。不要太过于用自己手里的矛去攻击别人的盾,哪怕一时争辩过了也多半可能是你被安放的角色不同。取别人之强补自己之弱,矛与盾的结合可能就是坦克。
能把复杂的知识讲的简单很重要
在学习的过程中我们看过很多资料、视频、文档等,因为现在资料视频都较多所以往往一个知识点会有多种多样的视频形式讲解。除了推广营销以外,确实有很多人的视频讲解非常优秀,例如李永乐老师的短视频课,可以在一个黑板上把那么复杂的知识,讲解的那么容易理解,那么透彻。而我们学习编程的人也是,不只是要学会把知识点讲明白,也要写明白。
提升自己的眼界交往更多同好
策略模式也有点像三国演义中诸葛亮给刘关张的锦囊;
在本案例中我们模拟在购买商品时候使用的各种类型优惠券(满减、直减、折扣、n元购)
这个场景几乎也是大家的一个日常购物省钱渠道,购买商品的时候都希望找一些优惠券,让购买的商品更加实惠。而且到了大促的时候就会有更多的优惠券需要计算那些商品一起购买更加优惠!!!
这样的场景有时候用户用起来还是蛮爽的,但是最初这样功能的设定以及产品的不断迭代,对于程序员开发还是不太容易的。因为这里包括了很多的规则和优惠逻辑,所以我们模拟其中的一个计算优惠的方式,使用策略模式来实现。
这里我们先使用最粗暴的方式来实现功能
对于优惠券的设计最初可能非常简单,就是一个金额的抵扣,也没有现在这么多种类型。所以如果没有这样场景的经验话,往往设计上也是非常简单的。但随着产品功能的不断迭代,如果程序最初设计的不具备很好的扩展性,那么往后就会越来越混乱。
与上面面向流程式的开发这里会使用设计模式,优惠代码结构,增强整体的扩展性。
itstack-demo-design-20-02└──src└──main└──java└──org.itstack.demo.design├──event│└──MJCouponDiscount.java│└──NYGCouponDiscount.java│└──ZJCouponDiscount.java│└──ZKCouponDiscount.java├──Context.java└──ICouponDiscount.java策略模式模型结构
publicinterfaceICouponDiscount{/***优惠券金额计算*@paramcouponInfo券折扣信息;直减、满减、折扣、N元购*@paramskuPricesku金额*@return优惠后金额*/BigDecimaldiscountAmount(TcouponInfo,BigDecimalskuPrice);}2.2优惠券接口实现满减
publicclassMJCouponDiscountimplementsICouponDiscount
publicclassZJCouponDiscountimplementsICouponDiscount{/***直减计算*1.使用商品价格减去优惠价格*2.最低支付金额1元*/publicBigDecimaldiscountAmount(DoublecouponInfo,BigDecimalskuPrice){BigDecimaldiscountAmount=skuPrice.subtract(newBigDecimal(couponInfo));if(discountAmount.compareTo(BigDecimal.ZERO)<1)returnBigDecimal.ONE;returndiscountAmount;}}折扣
publicclassZKCouponDiscountimplementsICouponDiscount{/***折扣计算*1.使用商品价格乘以折扣比例,为最后支付金额*2.保留两位小数*3.最低支付金额1元*/publicBigDecimaldiscountAmount(DoublecouponInfo,BigDecimalskuPrice){BigDecimaldiscountAmount=skuPrice.multiply(newBigDecimal(couponInfo)).setScale(2,BigDecimal.ROUND_HALF_UP);if(discountAmount.compareTo(BigDecimal.ZERO)<1)returnBigDecimal.ONE;returndiscountAmount;}}N元购
publicclassNYGCouponDiscountimplementsICouponDiscount{/***n元购购买*1.无论原价多少钱都固定金额购买*/publicBigDecimaldiscountAmount(DoublecouponInfo,BigDecimalskuPrice){returnnewBigDecimal(couponInfo);}}2.3策略控制类publicclassContext{privateICouponDiscountcouponDiscount;publicContext(ICouponDiscountcouponDiscount){this.couponDiscount=couponDiscount;}publicBigDecimaldiscountAmount(TcouponInfo,BigDecimalskuPrice){returncouponDiscount.discountAmount(couponInfo,skuPrice);}}3.测试验证3.1编写测试类(直减优惠)@Testpublicvoidtest_zj(){//直减;100-10,商品100元Contextcontext=newContext(newZJCouponDiscount());BigDecimaldiscountAmount=context.discountAmount(10D,newBigDecimal(100));logger.info("测试结果:直减优惠后金额{}",discountAmount);}测试结果
15:43:22.035[main]INFOorg.itstack.demo.design.test.ApiTest-测试结果:直减优惠后金额90Processfinishedwithexitcode03.2编写测试类(满减优惠)@Testpublicvoidtest_mj(){//满100减10,商品100元Context
15:43:42.695[main]INFOorg.itstack.demo.design.test.ApiTest-测试结果:满减优惠后金额90Processfinishedwithexitcode03.3编写测试类(折扣优惠)@Testpublicvoidtest_zk(){//折扣9折,商品100元Contextcontext=newContext(newZKCouponDiscount());BigDecimaldiscountAmount=context.discountAmount(0.9D,newBigDecimal(100));logger.info("测试结果:折扣9折后金额{}",discountAmount);}测试结果
15:44:05.602[main]INFOorg.itstack.demo.design.test.ApiTest-测试结果:折扣9折后金额90.00Processfinishedwithexitcode03.4编写测试类(n元购优惠)@Testpublicvoidtest_nyg(){//n元购;100-10,商品100元Contextcontext=newContext(newNYGCouponDiscount());BigDecimaldiscountAmount=context.discountAmount(90D,newBigDecimal(100));logger.info("测试结果:n元购优惠后金额{}",discountAmount);