美文网首页
责任链模式在实际开发中的应用

责任链模式在实际开发中的应用

作者: 狂奔如风 | 来源:发表于2020-07-16 15:22 被阅读0次

1.创建一个抽象类,方便责任规则传递。

抽象类中,抽象类作为自己的属性。并创建一个抽象方法;

eg:

public abstract class RuleHandler {

  public RuleHandler successor;

  public RuleHandler getSuccessor() {

      return successor;

  }

  public void setSuccessor(RuleHandler successor) {

      this.successor = successor;

  }

  public abstract ApiResponse handlerRequest(RuleDto rule);

}

2.实现抽象类方法。写自定义类自己的逻辑。

eg:

3.多个责任类实现抽象类方法,书写各自逻辑代码

4.责任链核心代码引用。

eg:

@Service

public class KruleService {

  private static final Logger LOG = LoggerFactory.getLogger(KruleService.class);

  @Autowired

  private RuleMapper ruleMapper;

  @Autowired

  private CheckTotalPrize checkTotalPrize;

  @Autowired

  private CheckFristHitPrize checkFristHitPrize;

  @Autowired

  private CheckMaxHitTime checkMaxHitTime;

  @Autowired

  private CheckHitRule checkHitRule;

  @Autowired

  private WinnerInfoMapper winnerInfoMapper;

  /**

    * 抽奖规则校验

    * @param userId

    * @return

    */

  public ApiResponse checkRule(Integer userId,Integer userFriendsId){

      ApiResponse<Object> response = new ApiResponse<>();

//    获取有效的一个奖品规则

      RuleDto rule =  this.ruleMapper.getVaildRuleOne();

      if(!Optional.ofNullable(rule).isPresent()){

        response.setMsg(ErrorResultEnum.NO_PRIZE_RULE.getMsg());

        response.setCode(ErrorResultEnum.NO_PRIZE_RULE.getCode());

        return response;

      }

      rule.setUserFriendsId(userFriendsId);

      rule.setUserId(userId);

      //  查询中奖纪录

      WinnerInfo winnerInfo = this.winnerInfoMapper.findWinnerInfoByFrindsId(userFriendsId);

      LOG.info("查询中奖纪录:{}",winnerInfo);

      if(Optional.ofNullable(winnerInfo).isPresent()){

        String couponsCode = winnerInfo.getCouponsCode();

        if(StringUtils.isEmpty(couponsCode)){

            response.setMsg(ErrorResultEnum.NO_HIT_PRIZE.getMsg());

            response.setCode(ErrorResultEnum.NO_HIT_PRIZE.getCode());

        }else{

            response.setMsg(ErrorResultEnum.HIT_PRIZE.getMsg().replace("XXXX",couponsCode));

            response.setCode(ErrorResultEnum.HIT_PRIZE.getCode());

        }

        return response;

      }

//    1.总奖品校验

      checkTotalPrize.setSuccessor(checkFristHitPrize);

      // 2.首次必中校验

      checkFristHitPrize.setSuccessor(checkMaxHitTime);

//    3.每人最多中奖校验

      checkMaxHitTime.setSuccessor(checkHitRule);

      return checkTotalPrize.handlerRequest(rule);

  }

}

相关文章

网友评论

      本文标题:责任链模式在实际开发中的应用

      本文链接:https://www.haomeiwen.com/subject/wrwjjftx.html