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

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

image.png


前言


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

  

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

image.png


结语


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


目录
相关文章
|
7月前
三类代码协同模式问题之对账方式主要类型然后解决
三类代码协同模式问题之对账方式主要类型然后解决
|
7月前
领域驱动设计问题之在DDD中,交易主订单和交易子订单代表了什么
领域驱动设计问题之在DDD中,交易主订单和交易子订单代表了什么
|
6月前
|
弹性计算 监控 Serverless
函数计算产品使用问题之如何处理银行转账场景遇到的高并发问题
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
7月前
|
数据格式
交易链路设计原则&模式问题之在进行抽象和替换时可能遇到的问题,如何解决
交易链路设计原则&模式问题之在进行抽象和替换时可能遇到的问题,如何解决
|
7月前
|
移动开发
交易链路设计原则&模式问题之在订单管理系统中,doOp接口实现多种按钮操作,如何解决
交易链路设计原则&模式问题之在订单管理系统中,doOp接口实现多种按钮操作,如何解决
|
7月前
|
设计模式 Java
交易链路设计原则&模式问题之依赖倒置原则体现在实际应用中,如何解决
交易链路设计原则&模式问题之依赖倒置原则体现在实际应用中,如何解决
|
7月前
|
存储 对象存储
业务系统架构实践问题之在设计领域时配置与单据之间的关系如何解决
业务系统架构实践问题之在设计领域时配置与单据之间的关系如何解决
|
7月前
交易链路设计原则&模式问题之在业务系统中,根据单一职责原则设计扩展点,如何解决
交易链路设计原则&模式问题之在业务系统中,根据单一职责原则设计扩展点,如何解决
|
安全 搜索推荐 数据挖掘
区块链分红代理系统开发逻辑部署-附源码规则示例
区块链分红代理系统开发逻辑部署-附源码规则示例
|
设计模式 移动开发 Java
浅谈交易链路中的一些设计原则&模式
作者对设计原则、模式等学习后,通过本文谈谈自己的感受。
159969 28