前言
XDM,今天是双十一,大家都剁手了吗?感觉今年各大电商平台的优惠力度不大,往年的11月11日这天,各大电商平台都会实时公布平台的最新交易数据,今年小编在网上,暂未查询到相关平台的双十一成交额的最新数据信息。今年没有公布最新的数据,可能是等双十一结束之后,各大平台公布双十一的销售额的时候会有惊喜吧。
相信做过电商的都了解不同的客户下单,可能相同的商品,在不同的贸易方式下,会有不同的商品总价信息,大家都是采用if...else 去判断贸易方式和价格计算的算法呢,还是采用设计模式呢。本次针对这种情况,采用策略设计模式来设计。
策略模式
策略模式是指有一定行动内容的相对稳定的策略名称,这种设计模式属于行为型模式。策略模式主要解决在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护,使用策略模式可以将不同的算法和业务独立封装起来,可以在项目运行中独立动态调用不同的算法和逻辑。
优点:
- 扩展性良好,利于维护
- 避免使用多重条件判断,减少 if...else
- 可以*动态切换不同的业务逻辑
缺点
- 会有很多实现的策略类
- 策略类需要暴露出来
案例理解
前段时间在开发交易域中台时,有个需求是根据不同的贸易方式,计算订单商品的总价信息。下面就以这个示例进行分析,首先了解到有N种贸易方式,在示例中举出四种,分别为贸易方式A、贸易方式B、贸易方式C、贸易方式D。
- 贸易方式A ,这种贸易方式一般指用户自提的方式,所以无快递邮寄费用和关税等费用。采用的商品总价计算逻辑是:(商品的单价*数量)-减去优惠。
- 贸易方式B,是指一般的快递邮寄的方式,有快递运费,无其他费用。则这种贸易方式的商品总价计算方式为:(商品的单价*数量)-优惠的总金额+快递邮寄费用。
- 贸易方式C ,需要从国外进口,可能有两段快递费用,一段*的快递运费,一段为境内的快递费用。在进口商品中,需要报关,产生关税费用。 所以计算商品总价格为:(商品单价*数量)-优惠金额+快递一段费用+快递二段费用
- 贸易方式D,需要从国外进口,可能有两段快递费用,一段*的快递运费,一段为境内的快递费用。在进口商品中,需要报关,产生关税费用。所以计算商品总价格为:(商品单价*数量)-优惠金额+快递一段费用+快递二段费用。
商品基础信息
商品基础信息包含:商品编码、商品单价、商品数量、优惠金额、税费金额、第一段运费金额、第二段运费金额,这是商品总价计算的基础业务参数,本文将以此来进行价格的计算。
@Data @ApiModel("商品信息") public class Goods { private String skuCode; private BigDecimal price; private int num; private BigDecimal discount; private BigDecimal taxes; private BigDecimal firstFreight; private BigDecimal secondFreight; }
策略接口
定义一个策略接口,使所有的策略都实现这个接口。
public interface TradeTypeStrategy { BigDecimal getGoodsTotalPrice(Goods goods); }
贸易类型对象
定义一个贸易类型的对象,维护一个策略接口对象的引用。
public class TradeType { private TradeTypeStrategy tradeTypeStrategy; public TradeType(TradeTypeStrategy tradeTypeStrategy){ this.tradeTypeStrategy = tradeTypeStrategy; } public BigDecimal executeStrategy(Goods goods){ return tradeTypeStrategy.getGoodsTotalPrice(goods); } }
编写实现
根据业务的实际需要,编写多种实现类,实现类中进行业务逻辑和算法的开发。一遍执行不同的策略,调用不同的业务逻辑和算法。示例进行了贸易方式A、贸易方式B、贸易方式C、贸易方式D的实现,简单代码如下:
贸易方式A 总价计算逻辑是:(商品的单价*数量)-减去优惠。
public class TradeTypeStrategyA implements TradeTypeStrategy { /** * * * */ @Override public BigDecimal getGoodsTotalPrice(Goods goods) { BigDecimal goodsTotalPrice = goods.getPrice().multiply(BigDecimal.valueOf(goods.getNum())).subtract(goods.getDiscount()); return goodsTotalPrice; } }
贸易方式B 总价计算方式为:(商品的单价*数量)-优惠的总金额+快递邮寄费用
public class TradeTypeStrategyB implements TradeTypeStrategy { @Override public BigDecimal getGoodsTotalPrice(Goods goods) { BigDecimal goodsTotalPrice = goods.getPrice().multiply(BigDecimal.valueOf(goods.getNum())) .subtract(goods.getDiscount()).add(goods.getFirstFreight()); return goodsTotalPrice; }
贸易方式C 总价格为:(商品单价*数量)-优惠金额+快递一段费用+快递二段费用
public class TradeTypeStrategyC implements TradeTypeStrategy { @Override public BigDecimal getGoodsTotalPrice(Goods goods) { BigDecimal goodsTotalPrice = goods.getPrice().multiply(BigDecimal.valueOf(goods.getNum())) .subtract(goods.getDiscount()).add(goods.getFirstFreight()).add(goods.getTaxes()); return goodsTotalPrice; } }
贸易方式D 总价格为:(商品单价*数量)-优惠金额+快递一段费用+快递二段费用
public class TradeTypeStrategyD implements TradeTypeStrategy { @Override public BigDecimal getGoodsTotalPrice(Goods goods) { BigDecimal goodsTotalPrice = goods.getPrice().multiply(BigDecimal.valueOf(goods.getNum())) .subtract(goods.getDiscount()).add(goods.getFirstFreight()).add(goods.getSecondFreight()).add(goods.getTaxes()); return goodsTotalPrice; } }
运行测试
编写测试类,本测试使用的是同一个商品信息,当用户在不同的贸易方式下下单之后,可以看到输出的订单商品的总价是不同的。
public class MainTrade { public static void main(String[] args) { Goods goods = new Goods(); goods.setSkuCode("G888888"); goods.setPrice(BigDecimal.valueOf(100)); goods.setFirstFreight(BigDecimal.valueOf(20)); goods.setNum(3); goods.setSecondFreight(BigDecimal.valueOf(8)); goods.setDiscount(BigDecimal.TEN); goods.setTaxes(BigDecimal.valueOf(32)); TradeType tradeTypeA = new TradeType(new TradeTypeStrategyA()); System.out.println("贸易方式A的总价是 = " + tradeTypeA.executeStrategy(goods)); TradeType tradeTypeB = new TradeType(new TradeTypeStrategyB()); System.out.println("贸易方式B的总价是 = " + tradeTypeB.executeStrategy(goods)); TradeType tradeTypeC = new TradeType(new TradeTypeStrategyC()); System.out.println("贸易方式C的总价是 = " + tradeTypeC.executeStrategy(goods)); TradeType tradeTypeD = new TradeType(new TradeTypeStrategyD()); System.out.println("贸易方式D的总价是 = " + tradeTypeD.executeStrategy(goods)); } }
如下图,可以看到在不同的贸易方式下,输出的订单商品总价是不同的。示例信息仅供参考,在计算总价信息是有更复杂的业务逻辑和
结语
好了,以上就是策略模式的使用介绍