本文介绍: **case “Simlpe” : //可以利用一些获取Bean的工具获取, 避免new //SpringApplicationUtil.getBean(SimlpeOrder.class);} } /*** 检查参数/*** 获取商品/*** 扣减库存/*** 扣减积分/*** 保存订单/*** 执行模版/**

设计模式 总目录

https://preparedata.blog.csdn.net/article/details/134512591

一、案例

在的下单业务中,可以将下单逻辑拆分,可能存在检验参数、获取商品、 扣减库存、核销优惠券、抵扣积分保存订单等等。

应为业务的不同,可能下单处理节点不同(扣减库存、核销优惠券、抵扣积分,可能需要,可能不需要,也可能相互组合)。这是我们在单一下单接口中,逻辑比较复杂需要各种判断,各种兼容,后续代码逻辑很难清晰

这是我们可以借助模版模式,将下单逻辑各个节点拆分,将具体各节点执行进行模版组合一个模版对应一套逻辑, 具体的下单逻辑,派发给模版执行

1.定义 抽象类 AbstractOrderTemplate 定义声明拆分下单逻辑, 声明模版执行; 通过业务类型来获取模版

2.定义 实现DefaultOrder默认执行模版SimlpeOrder (其他的执行模版)继承AbstractOrderTemplate, 实现抽象类AbstractOrderTemplate的模版执行。

通过模版可以自由区组合业务节点, 打包一个执行整体

二、抽象类模版 AbstractOrderTemplate(顶层的订单抽象类)

package com.pd.shopping.order.designptern.template;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * @author hll
 */
@Slf4j
@Component
public abstract class AbstractOrderTemplate {

    public static AbstractOrderTemplate getInstance(String orderType) {
        switch (orderType){
            case "Simlpe":
                //可以利用一些获取Bean的工具获取, 避免new
                //SpringApplicationUtil.getBean(SimlpeOrder.class);
                return new SimlpeOrder();
            case "Default":
                return new DefaultOrder();
            default:
                return new DefaultOrder();
        }
    }

    /**
     * 检查参数
     * @param map
     */
    public abstract void check(Map<String, Object> map);

    /**
     * 获取商品
     * @param map
     */
    public abstract void getGoods(Map<String, Object> map);


    /**
     * 扣减库存
     * @param map
     */
    public abstract void deductStock(Map<String,Object> map);


    /**
     * 扣减积分
     * @param map
     */
    public abstract void deductPoint(Map<String,Object> map);


    /**
     * 保存订单
     * @param map
     */
    public abstract void saveOrder(Map<String,Object> map);


    /**
     * 执行模版
     * @param map
     */
    public abstract void executeTemplate(Map<String,Object> map);
}


三、执行模版的实现

3.1 默认执行模版 DefaultOrder

package com.pd.shopping.order.designptern.template;

import java.util.Map;

public class DefaultOrder extends AbstractOrderTemplate {


    @Override
    public void check(Map<String, Object> map) {

    }

    @Override
    public void getGoods(Map<String, Object> map) {

    }

    @Override
    public void deductStock(Map<String, Object> map) {

    }

    @Override
    public void deductPoint(Map<String, Object> map) {

    }

    @Override
    public void saveOrder(Map<String, Object> map) {

    }

    @Override
    public void executeTemplate(Map<String, Object> map) {
        //检查参数
        check(map);
        //获取商品
        getGoods(map);
        //扣减库存
        deductStock(map);
        //扣减积分
        deductPoint(map);
        //保存订单
        saveOrder(map);
    }
}

3.2 其他执行模版 SimlpeOrder

package com.pd.shopping.order.designptern.template;

import java.util.Map;

public class SimlpeOrder extends AbstractOrderTemplate {


    @Override
    public void check(Map<String, Object> map) {

    }

    @Override
    public void getGoods(Map<String, Object> map) {

    }

    @Override
    public void deductStock(Map<String, Object> map) {

    }

    @Override
    public void deductPoint(Map<String, Object> map) {

    }

    @Override
    public void saveOrder(Map<String, Object> map) {

    }

    @Override
    public void executeTemplate(Map<String, Object> map) {
        //检查参数
        check(map);
        //获取商品
        getGoods(map);
        //保存订单
        saveOrder(map);
    }
}

四、调用

	@GetMapping("/templateOrder")
    public void templateOrder() {
         AbstractOrderTemplate.getInstance("Simlpe").executeTemplate(new HashMap<>());
        AbstractOrderTemplate.getInstance("Default").executeTemplate(new HashMap<>());

    }

原文地址:https://blog.csdn.net/sinat_16998945/article/details/134551660

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_13269.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注