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

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

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


结语


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


目录
相关文章
|
3月前
|
存储 人工智能 分布式计算
swap去中心化交易系统开发|详情规则|设计原理
Web3.0的技术支撑包括区块链技术、人工智能、物联网、去中心化存储、加密算法、分布式计算等。
|
9月前
|
安全 搜索推荐 数据挖掘
区块链分红代理系统开发逻辑部署-附源码规则示例
区块链分红代理系统开发逻辑部署-附源码规则示例
|
5月前
怎么做问答推广?问答营销的步骤和逻辑
怎么做问答推广?问答营销的步骤和逻辑
|
7月前
|
机器人
量化交易/秒合约/交易所系统开发案例详解/功能说明/规则策略/源码模式
量化交易/秒合约/交易所系统开发案例详解/功能说明/规则策略/源码模式
|
9月前
|
安全
秒合约/合约交易/合约跟单项目系统开发程序功能/规则玩法/逻辑方案/需求步骤/源码说明
Contract trading is a financial derivative trading method that is based on contracts and does not involve actual asset delivery. In contract trading, both parties sign a contract, agreeing to deliver or settle at a certain point in the future according to agreed terms.
|
9月前
|
存储 安全 区块链
哈希竞猜游戏系统开发(规则策略)丨dapp链上合约游戏系统开发(方案逻辑)/源码程序
区块哈希函数是一种将区块的数据转换为固定长度哈希值的函数。该函数是单向的,这意味着很难从哈希值反向计算区块的数据。哈希值用于验证区块的完整性和防篡改。
|
9月前
|
开发框架 安全
注册奖励每日任务模式系统开发简单源码示例
注册奖励每日任务模式系统开发简单源码示例
|
9月前
|
Python
币安现货网格交易策略搭建执行代码实例分析
币安现货网格交易策略搭建执行代码实例分析
|
9月前
|
机器人 API
现货合约交易量化机器人开发设计执行逻辑源码实例分析
现货合约交易量化机器人开发设计执行逻辑源码实例分析
|
10月前
|
人工智能 算法 机器人
现货量化+合约交易+合约跟单系统开发(案例开发)/策略详细/逻辑方案/项目源码
 量化交易需要以大量的数据作为基础,通过对大量数据的分析,来做出理性的判断,预测未来价格的走势,量化交易从狭义上来说就是指程序化的交易,自动下单。从广义上来说,就是指系统性的交易,量化交易可以简单理解为机器人交易,用计算机算法来交易。