优惠券使用---责任链模式

一:抽象使用优惠券业务逻辑接口

import java.math.BigDecimal;
import java.util.List;

/**
 *@ClassName UseCouponBase
 *@Description TODO  抽象使用优惠券业务逻辑接口
 *@Author Ni Klaus
 *@Date 2019/9/9 0009 下午 16:58
 *@Version 1.0
 */
interface UseCouponBase{
    // 所有处理逻辑的方法
    void doSomething(List couponList,UseCouponBase useCouponBase, BigDecimal discounts);
}

二:使用优惠券路由(控制操作)

import lombok.Data;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author Ni Klaus
 * @Description //TODO 使用优惠券路由
 * @Date 上午 11:15 2019/9/17 0017
 * @Param 
 * @return 
 **/
@Data
public class UseCouponChain implements UseCouponBase{
    // 所有 case 列表
    private List<UseCouponBase> mCaseList = new ArrayList<>();
    // 索引,用于遍历所有 case 列表
    private int index = 0;

    // 添加 case
    public UseCouponChain addBaseCase(UseCouponBase base) {
        mCaseList.add(base);
        return this;
    }

    @Override
    public void doSomething(List couponList,UseCouponBase useCouponBase,BigDecimal discounts) {
        //所有遍历完了,直接返回
        if(index == mCaseList.size()){
            return;
        }
        //获取当前 case
        UseCouponBase currentCase = mCaseList.get(index);
        //修改索引值,以便下次回调获取下个节点,达到遍历效果
        index++;
        //调用 当前 case 处理方法
        currentCase.doSomething(couponList,useCouponBase,discounts);
    }
}

三:定义不同优惠券的业务逻辑处理执行器

满减券:

import java.math.BigDecimal;
import java.util.List;

/**
 *@ClassName CheckDyCoupon
 *@Description TODO 满减券 执行器
 *@Author Ni Klaus
 *@Date 2019/9/9 0009 下午 17:20
 *@Version 1.0
 */
public class UseMjCoupon implements UseCouponBase{
    @Override
    public void doSomething(List couponList, UseCouponBase useCouponBase, BigDecimal discounts) {

        System.out.println("使用满减券逻辑处理");
        //使用满减券逻辑处理(怎么使用的代码此处我就省略了,具体业务逻辑具体实现就行)

        //交给下一个处理
        useCouponBase.doSomething(couponList,useCouponBase,discounts);
    }
}

折扣券:

import java.math.BigDecimal;
import java.util.List;

/**
 * @Author Ni Klaus
 * @Description //TODO 折扣券 执行器
 * @Date 下午 15:21 2019/9/16 0016
 * @Param
 * @return 
 **/
public class UseZkCoupon implements UseCouponBase{
    @Override
    public void doSomething(List couponList, UseCouponBase useCouponBase, BigDecimal discounts){

        System.out.println("使用折扣券逻辑处理");
        //使用折扣券逻辑处理(怎么使用的代码此处我就省略了,具体业务逻辑具体实现就行)

        //交给下一个执行器处理
        useCouponBase.doSomething(couponList,useCouponBase,discounts);
    }
}

如果还要其它类型的优惠券只需要增加执行器就行,拓展性比较强。

 

四:测试

import com.sgl.designpattern.chain_of_responsibility.module.UseCouponChain;
import com.sgl.designpattern.chain_of_responsibility.module.UseMjCoupon;
import com.sgl.designpattern.chain_of_responsibility.module.UseZkCoupon;
import org.springframework.stereotype.Controller;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 *@ClassName UseCoupon
 *@Description TODO  消费优惠券  -------  责任链模式
 *@Author Ni Klaus
 *@Date 2019/9/24 0024 下午 15:02
 *@Version 1.0
 */
@Controller
public class UseCoupon {

    public static void main(String[] args) {
        //新建一个各类优惠券处理路由
        UseCouponChain useCouponChain = new UseCouponChain();
        //需要处理哪些优惠券按顺序添加进路由就行
        useCouponChain.addBaseCase(new UseMjCoupon())
                .addBaseCase(new UseZkCoupon());
        /*这里couponList 是形参,
        具体业务中可以是用户的可用优惠券列表,
        可以传入执行器中进行业务逻辑处理*/
        List couponList = new ArrayList<>();
        //执行业务逻辑处理
        useCouponChain.doSomething(couponList,useCouponChain,new BigDecimal(0));
    }

}

测试结果:

 

五:源代码下载:https://github.com/Hak-L/designpattern

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值