贵阳建站公司,网店如何做推广,百度推广竞价技巧,农家乐网站模板一、计算逻辑的类结构图 在这张图里#xff0c;顶层接口 RuleTemplate 定义了 calculate 方法#xff0c;抽象模板类 AbstractRuleTemplate 将通用的模板计算逻辑在 calculate 方法中实现#xff0c;同时它还定义了一个抽象方法 calculateNewPrice 作为子类的扩展点。各个具…一、计算逻辑的类结构图 在这张图里顶层接口 RuleTemplate 定义了 calculate 方法抽象模板类 AbstractRuleTemplate 将通用的模板计算逻辑在 calculate 方法中实现同时它还定义了一个抽象方法 calculateNewPrice 作为子类的扩展点。各个具体的优惠计算类通过继承 AbstractRuleTemplate并实现 calculateNewPrice 来编写自己的优惠计算方式。 二、代码实现
1、RuleTemplate.java
public interface RuleTemplate {// 计算优惠券ShoppingCart calculate(ShoppingCart settlement);
}
2、AbstractRuleTemplate.java
public ShoppingCart calculate(ShoppingCart order) {// 获取订单总价Long orderTotalAmount getTotalPrice(order.getProducts());// 获取以shopId为维度的总价统计MapLong, Long sumAmount getTotalPriceGroupByShop(order.getProducts());CouponTemplateInfo template order.getCouponInfos().get(0).getTemplate();// 最低消费限制Long threshold template.getRule().getDiscount().getThreshold();// 优惠金额或者打折比例Long quota template.getRule().getDiscount().getQuota();// 如果优惠券未指定shopId则shopTotalAmountorderTotalAmount// 如果指定了shopId则shopTotalAmount对应门店下商品总价Long shopId template.getShopId();Long shopTotalAmount (shopId null) ? orderTotalAmount : sumAmount.get(shopId);// 如果不符合优惠券使用标准, 则直接按原价走不使用优惠券if (shopTotalAmount null || shopTotalAmount threshold) {log.debug(Totals of amount not meet);order.setCost(orderTotalAmount);order.setCouponInfos(Collections.emptyList());return order;}// 子类中实现calculateNewPrice计算新的价格Long newCost calculateNewPrice(orderTotalAmount, shopTotalAmount, quota);if (newCost minCost()) {newCost minCost();}order.setCost(newCost);log.debug(original price{}, new price{}, orderTotalAmount, newCost);return order;
}
3、子类
MoneyOffTemplate.java
Slf4j
Component
public class MoneyOffTemplate extends AbstractRuleTemplate implements RuleTemplate {Overrideprotected Long calculateNewPrice(Long totalAmount, Long shopAmount, Long quota) {// benefitAmount是扣减的价格// 如果当前门店的商品总价quota那么最多只能扣减shopAmount的钱数Long benefitAmount shopAmount quota ? shopAmount : quota;return totalAmount - benefitAmount;}
}
4、工厂类
CouponTemplateFactory.java
Component
Slf4j
public class CouponTemplateFactory {Autowiredprivate MoneyOffTemplate moneyOffTemplate;Autowiredprivate DiscountTemplate discountTemplate;Autowiredprivate RandomReductionTemplate randomReductionTemplate;Autowiredprivate LonelyNightTemplate lonelyNightTemplate;Autowiredprivate DummyTemplate dummyTemplate;Autowiredprivate AntiPauTemplate antiPauTemplate;public RuleTemplate getTemplate(ShoppingCart order) {// 不使用优惠券if (CollectionUtils.isEmpty(order.getCouponInfos())) {// dummy模板直接返回原价不进行优惠计算return dummyTemplate;}// 获取优惠券的类别// 目前每个订单只支持单张优惠券CouponTemplateInfo template order.getCouponInfos().get(0).getTemplate();CouponType category CouponType.convert(template.getType());switch (category) {// 订单满减券case MONEY_OFF:return moneyOffTemplate;// 随机立减券case RANDOM_DISCOUNT:return randomReductionTemplate;// 午夜下单优惠翻倍case LONELY_NIGHT_MONEY_OFF:return lonelyNightTemplate;// 打折券case DISCOUNT:return discountTemplate;case ANTI_PUA:return antiPauTemplate;// 未知类型的券模板default:return dummyTemplate;}}}
5、使用
CouponCalculationServiceImpl.java Autowiredprivate CouponTemplateFactory couponProcessorFactory;// 优惠券结算// 这里通过Factory类决定使用哪个底层Rule底层规则对上层透明Overridepublic ShoppingCart calculateOrderPrice(RequestBody ShoppingCart cart) {log.info(calculate order price: {}, JSON.toJSONString(cart));RuleTemplate ruleTemplate couponProcessorFactory.getTemplate(cart);return ruleTemplate.calculate(cart);}