一:抽象使用优惠券业务逻辑接口
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));
}
}
测试结果: