双十一基于交易域的策略模式示例介绍

双十一基于交易域的策略模式示例介绍


前言


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

  

如下图,可以看到在不同的贸易方式下,输出的订单商品总价是不同的。示例信息仅供参考,在计算总价信息是有更复杂的业务逻辑和

双十一基于交易域的策略模式示例介绍


结语


  好了,以上就是策略模式的使用介绍


上一篇:Android 调用webService


下一篇:Android Menu开源项目整合工程