首页 > 其他分享 >springboot策略模式

springboot策略模式

时间:2023-09-07 19:56:51浏览次数:38  
标签:status getCode springboot userId gameTask 模式 param public 策略

一.定义接口

public interface PearlTaskService {
  Integer getTaskType();
  Map<String,Integer> execute(Long userId, GameTask gameTask, String gameCode);
}

二.定义抽象类

@Slf4j
public  abstract class PearlTaskStrategy implements PearlTaskService {

  protected GameLabelDurationFacade gameLabelDurationFacade;

  public PearlTaskStrategy(GameLabelDurationFacade gameLabelDurationFacade) {
    this.gameLabelDurationFacade = gameLabelDurationFacade;//由子类负责初始化
  }

  /**
   * 查询某一天在线时长
   *
   * @param userId
   * @param gameCode
   * @param beginTime
   * @param endTime
   * @return
   */
  public int getOnlineDuration(Long userId, String gameCode, LocalDateTime
      beginTime, LocalDateTime endTime) {
    Long startTime = System.currentTimeMillis();
    JSONObject resultObject = gameLabelDurationFacade.getGameTimeRange(userId, gameCode, beginTime,
        endTime);
    Long time = System.currentTimeMillis();
    Long seconds = (time - startTime) ;
    
    if (resultObject == null) {
      return 0;
    }
    //接口返回的时长单位是秒
    Float duration = resultObject.getFloat("total_time");
    if (duration == null) {
      return 0;
    }
    //返回分钟
    int min = (int) (duration / 60);
    return min;
  }
}

三.创建业务类

/**
 * 今日在线任务服务实现类
 */
@Slf4j
@Service
public class TodayOnlineTaskServiceImpl extends PearlTaskStrategy  {

  @Autowired
  private UserGameTaskService userGameTaskService;

  @Autowired
  public TodayOnlineTaskServiceImpl(GameLabelDurationFacade gameLabelDurationFacade) {
    super(gameLabelDurationFacade);//初始化基类里的接口
  }

  @Override
  @RedisLock(spEL = "'member_pearl_to_task_#' + #userId", waitTime = 5000L)
  public Map<String,Integer> execute(Long userId, GameTask gameTask, String gameCode) {
    Long beginTime = System.currentTimeMillis();
    Map<String,Integer> hashMap = new HashMap<>();
    int status = 1;
    LocalDateTime start = LocalDate.now().atStartOfDay();
    LocalDateTime end = LocalDateTime.now();
    Integer gameTaskId = gameTask.getId();
    UserGameTask todayTask = userGameTaskService.findUserGameTask(userId, gameTaskId, start);//查询今日在线时长
    int min = getOnlineDuration(userId, gameCode, start, end);
    log.info("[TodayOnlineTaskServiceImpl.execute]用户id为:{} ,getOnlineDays返回结果 :{}", userId,
        min);
    if (todayTask != null) {
      if (UserGameTaskStatusConstants.UNDONE.getCode() == todayTask.getStatus()) {
        if (min >= Integer.parseInt(gameTask.getUnitNum())) {
          status = UserGameTaskStatusConstants.GETTING.getCode();
          userGameTaskService.updateStatus(status, null, todayTask.getId());
          hashMap.put("status", status);
          return hashMap;
        }
      } else {
        status = todayTask.getStatus();
      }
    } else {
      UserGameTask userGameTask = new UserGameTask();
      if (min >= Integer.parseInt(gameTask.getUnitNum())) {
        status = UserGameTaskStatusConstants.GETTING.getCode();
      } else {
        status = UserGameTaskStatusConstants.UNDONE.getCode();
      }
      userGameTask.setStatus(status);
      userGameTask.setUserId(userId);
      userGameTask.setGameTaskId(gameTask.getId());
      userGameTaskService.insert(userGameTask);
    }
    hashMap.put("status", status);return hashMap;
  }

  @Override
  public Integer getTaskType() {
    return UserGameTaskTypeConstants.TODAY_ONLINE.getCode();
  }
}

四.调用:使用InitializingBean对接口初始化,根据每个业务类的getTaskType()调用不同的业务类

@Service
@Slf4j
public class UserGameTaskFacadeImpl implements UserGameTaskFacade, InitializingBean {

  @Autowired
  private List<PearlTaskService> services;

  private Map<Integer, PearlTaskService> pearlTaskStrategyMap;

  @Autowired
  private GameTaskService gameTaskService;


  /**
   * 福利任务维护
   *
   * @param userGameTaskReqDto
   * @return
   */
  @Override
  public List<UserGameTaskRespDto> pearlActivityExecute(UserGameTaskReqDto userGameTaskReqDto) {
    Long userId = userGameTaskReqDto.getUserId();
    Integer gameId = userGameTaskReqDto.getGameId();

    GameDto gameDto = gameTaskService.findTaskGameInfoById(gameId);
    if (gameDto == null) {
      throw new BusinessException(BusinessConstants.NORMAL_PARAM_ERROR.getCode(), "游戏不存在!");
    }
    String gameCode = gameDto.getCode();
    GameTask param = new GameTask();
    param.setType(gameDto.getType());
    param.setGameId(gameId);
    param.setOrigin(userGameTaskReqDto.getOrigin());
    param.setSys(userGameTaskReqDto.getSys());
    //查游戏有哪些活动任务

    List<GameTask> gameTasks = gameTaskService.findGameTaskList(param);
    if (gameTasks == null) {
      throw new BusinessException(BusinessConstants.NORMAL_BUSINESS_ERROR.getCode(), "游戏任务不存在!");
    }
    List<UserGameTaskRespDto> respDtos = new ArrayList<>();
    for (GameTask gameTask : gameTasks) {
      Integer taskType = gameTask.getTaskType();
      UserGameTaskRespDto respDto = new UserGameTaskRespDto();
      CopyUtils.copy(respDto, gameTask);
      respDto.setGameTaskId(gameTask.getId());
      respDto.setTaskType(gameTask.getTaskType());
      if (taskType.equals(UserGameTaskTypeConstants.TODAY_ONLINE.getCode())) {
        respDto.setTaskName(
            UserGameTaskTypeConstants.TODAY_ONLINE.getMsg() + gameTask.getUnitNum()
                + CommonPearlConstants.minutes);
        //每日在线时长任务
        PearlTaskService pearlTaskService = pearlTaskStrategyMap.get(UserGameTaskTypeConstants.TODAY_ONLINE.getCode());
        Map hashMap = pearlTaskService.execute(userId, gameTask, gameCode);
        respDto.setStatus((Integer) hashMap.get("status"));
      }
      if (taskType.equals(UserGameTaskTypeConstants.YESTERDAY_ONLINE.getCode())) {
        respDto.setTaskName(
            UserGameTaskTypeConstants.YESTERDAY_ONLINE.getMsg() + gameTask.getUnitNum()
                + CommonPearlConstants.minutes);
        //昨日在线时长任务
        PearlTaskService pearlTaskService = pearlTaskStrategyMap.get(UserGameTaskTypeConstants.YESTERDAY_ONLINE.getCode());
        Map hashMap = pearlTaskService.execute(userId, gameTask, gameCode);
        respDto.setStatus((Integer) hashMap.get("status"));
      }
 
      respDtos.add(respDto);
    }

    return respDtos;
  }

  @Override
  public void afterPropertiesSet()   {
    log.info("[afterPropertiesSet]services :{}",JsonUtils.obj2String(services));
    pearlTaskStrategyMap = services.stream().collect(Collectors.toMap(PearlTaskService::getTaskType, Function.identity()));
    log.info("[afterPropertiesSet]pearlTaskStrategyMap :{}",JsonUtils.obj2String(pearlTaskStrategyMap));
  }
}

 

标签:status,getCode,springboot,userId,gameTask,模式,param,public,策略
From: https://www.cnblogs.com/Anti-General/p/17685922.html

相关文章

  • 不用额外插件?RunnerGo内置压测模式怎么选
    我们在做性能测试时需要根据性能需求配置不同的压测模式如:阶梯模式。使用jmeter时我们需要安装插件来配置测试模式,为了方便用户使用,RunnerGo内嵌了压测模式这一选项,今天给大家介绍一下RunnerGo的几种压测模式和怎么根据性能需求选择合适的压测模式。RunnerGo提供了以下五种压测模式......
  • 装饰模式(decorator)
    装饰器模式(Decorator)1、作用引入一个设计原则:类应该对扩展开发,对修改关闭。简单的说,就是允许我们的我们的类进行扩展,在不修改现有代码的情况下,适应新的行为改变。当实现好的类有了新的需求,不考虑重用的话,会直接修改(现在写代码都这样,没有满足开闭原则的修改关闭原则),如果考虑代......
  • 享元模式(flyweight)
    享元模式(flyweight)1、作用一些对象在使用一次后就可以销毁了,比如画一个圈,这个对象调用draw()函数后,这个对象就没有作用,除非再次画相同的圈。但是在应用中需要画很多圈,如果每次画一次圈都构造一个对象,这样内存消耗很多,构造销毁也很费时,这个时候就可以考虑一下享元模式,这样可以节......
  • 代理模式(Proxy)
    代理模式(Proxy)1、作用代理模式是包装一个对象,控制对它的访问,实现逻辑合实现的解耦。2、实现方式代理模式跟装饰器模式、适配器模式、外观模式都有类似的地方,都通过关联关系封装了其他类型的对象,但是使用的目的不一样。代理:包装一个对象,控制对它的访问。装饰者:包装另一个对象......
  • 策略模式(strategy)
    策略模式(Strategy)1、作用策略模式的主要目的主要是将算法的定义(strategy类)和使用分开(context类),也就是将算法的行为和环境分开,将算法的定义放在专门的策略类中,每一个策略类封装一个实现算法。而使用算法的环境中针对抽象策略编程,而不是针对实现编程,符合依赖倒置原则。2、实现方......
  • 模板模式(template)
    模板模式(Template)1、作用做一件是的方法很多,但做这件都可以归纳为几个步骤。这个时候可以使用模板模式,在模板类中,定义做事的步骤,将多种实现做事的细节延迟到子类中去实现。即:定义一个操作中的算法的骨架(模板函数),而将一些步骤延迟到子类中(基本函数)。模板方法使得子类可以不改变......
  • 外观模式(facade)
    外观模式(Facade)1、作用(1)、将各个子系统的接口汇聚在一起,定义一个统一的接口方便客户使用,满足“迪米特法则”,即客户不需要了解子系统,只需要知道Facade模式封装的类即可以使用所有子系统。(2)、隔离用户和子系统,将用户与子系统解耦,当子系统有修改是,顶多修改Facade模式封装的类,无需......
  • 桥接模式
    桥接模式1作用当类的模型有两个或多个维度的时候,如果两个变化维度用同一个类使用继承方式实现会变得很复杂(冗余代码很多),不易于维护和扩展(继承关系是一种强耦合关系),为了降低耦合关系,提高维护性和可扩展性,可以将两个变化维度的通过两个类(abstruction、implementor类)来实现,将两......
  • SpringBoot整合thymeleaf
    JavaEE领域有几种常用的模板引擎:Jsp,Thymeleaf,Freemarker,Velocity等.对于前端页面渲染效率来说JSP其实还是最快的,Velocity次之.Thymeleaf虽然渲染效率不是很快,但语法比较轻巧.Thymeleaf支持html5标准,Thymeleaf页面无需部署到servlet开发到服务器上,以.html后缀结......
  • LRUCache算法缓存策略(map+doubleLinkedList)
    packagearithmetic;importjava.util.HashMap;publicclassFaceTest81{//LRUcache缓存策略map+双向链表//get、update、put需要时间复杂度达到O1//map+双向链表结构publicFaceTest81(intcapacity){ cache=newMyCache(capacity);}privateMyCache<Integer,Intege......