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

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

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


结语


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


目录
相关文章
|
11月前
|
安全 搜索推荐 数据挖掘
区块链分红代理系统开发逻辑部署-附源码规则示例
区块链分红代理系统开发逻辑部署-附源码规则示例
|
11月前
|
Python
币安现货网格交易策略搭建执行代码实例分析
币安现货网格交易策略搭建执行代码实例分析
|
11月前
|
开发框架 安全
注册奖励每日任务模式系统开发简单源码示例
注册奖励每日任务模式系统开发简单源码示例
|
11月前
|
存储 安全 区块链
哈希竞猜游戏系统开发(规则策略)丨dapp链上合约游戏系统开发(方案逻辑)/源码程序
区块哈希函数是一种将区块的数据转换为固定长度哈希值的函数。该函数是单向的,这意味着很难从哈希值反向计算区块的数据。哈希值用于验证区块的完整性和防篡改。
|
人工智能 算法 机器人
现货量化+合约交易+合约跟单系统开发(案例开发)/策略详细/逻辑方案/项目源码
 量化交易需要以大量的数据作为基础,通过对大量数据的分析,来做出理性的判断,预测未来价格的走势,量化交易从狭义上来说就是指程序化的交易,自动下单。从广义上来说,就是指系统性的交易,量化交易可以简单理解为机器人交易,用计算机算法来交易。
DAPP燃烧机制模式合约代币项目系统开发案例详情/规则玩法/方案逻辑/代码详解
Independent public chain development refers to the establishment of an independent public chain network beyond the existing blockchain network. Compared to developing on existing blockchain networks, the significance of independent public chain development is that it can more flexibly and autonomous
|
机器学习/深度学习 Java API
股票自动交易系统开发程序设计(源码示例)
股票自动交易系统开发程序设计(源码示例)
|
前端开发 微服务
微服务项目:尚融宝(59)(核心业务流程:提现和还款(2))
微服务项目:尚融宝(59)(核心业务流程:提现和还款(2))
微服务项目:尚融宝(59)(核心业务流程:提现和还款(2))
|
前端开发 决策智能 微服务
微服务项目:尚融宝(58)(核心业务流程:提现和还款(1))
微服务项目:尚融宝(58)(核心业务流程:提现和还款(1))
微服务项目:尚融宝(58)(核心业务流程:提现和还款(1))
|
开发者
交易和关系 | 学习笔记
快速学习交易和关系 。.
117 0
交易和关系 | 学习笔记