首页 > 其他分享 >策略模式简单运用

策略模式简单运用

时间:2024-05-02 14:22:06浏览次数:35  
标签:Task 策略 void 模式 任务 task newTask 运用 public

策略模式简单运用

背景是 根据不同的渠道,处理不同的任务,相比if else 可以不用动主逻辑代码,代码可维护性好点,每次处理不同渠道的任务只需要改对应的实现,缺点就是的增加类的数量,核心就是多态。

1. 定义接口
public interface TaskFileHandleService {

    /**
     * 获取任务类型
     * @return
     */
    TaskTypeEnum getTaskType();

    /**
     * 任务文件处理
     * @param task
     */
    void taskFileHandle(Task task);

}

2. 定义宏观类

注入 所有接口实现类,循环匹配即可。

@Service
public class TaskFileHandleStrategy {

    @Autowired
    private List<TaskFileHandleService> taskFileHandleServiceList;

    /**
     * 处理逻辑
     * @param task
     */
    public void handle(Task task){
        for (int i = 0; i < taskFileHandleServiceList.size(); i++) {
            TaskFileHandleService taskFileHandleService = taskFileHandleServiceList.get(i);
            TaskTypeEnum taskType = taskFileHandleService.getTaskType();
            if(Objects.equals(TaskTypeEnum.of(task.getTaskType()),taskType)){
                taskFileHandleService.taskFileHandle(task);
            }
        }
    }
}

3.使用

注入对应的类 taskFileHandleStrategy.handle(task) 即可,主逻辑不用动,每次新加任务,加一个具体实现类即可,也就是所谓面向 接口编程的灵活性。

  @Autowired
  private TaskFileHandleStrategy taskFileHandleStrategy;

  
  @Override
  public void handleTaskJob(List<Task> taskList) {
        if(CollectionUtil.isNotEmpty(taskList)){
            // 根据任务类型解析文件
            taskList.stream().forEach(task -> {
                // 导出任务 线程池 处理
                if(Objects.equals(TaskTypeEnum.DOWNLOAD_AIRCRAFT_CHEF.getValue(),task.getTaskType())){
                    executor.execute(() ->{
                        doTask(task);
                    });
                }else {
                    doTask(task);
                }
            });
        }
    }


 /**
     * 做任务
     * @param task
     */
    private void doTask(Task task){
        try {
            handleTask(task);
        }catch (Exception e){
            log.error("处理任务失败 任务id={} 任务名称={} 任务信息",task.getId(),task.getName(),e);
            task.setFailReason(ExceptionUtil.stacktraceToOneLineString(e,Constants.EXCEPTION_MSG_SIZE));
            handleFailed(task);
        }
    }

   /**
     * 处理任务
     * @param task
     */
    private void handleTask(Task task) {
        Task newTask = new Task();
        newTask.setId(task.getId());
        newTask.setStatus(TaskStatusEnum.PROCESSING.getValue());
        newTask.setStartTime(LocalDateTime.now());
        updateById(newTask);
        taskFileHandleStrategy.handle(task);
        handleSuccess(task);
    }

标签:Task,策略,void,模式,任务,task,newTask,运用,public
From: https://www.cnblogs.com/lyc88/p/18170156

相关文章

  • Seata AT模式学习
    官方文档Seata是目前国内最流行的一个分布式事务的组件,支持以下4种模式AT模式:对业务代码无侵入,只要在业务的数据库加上一个UNDO_LOG表,在配置文件中配置好Seata的服务端,在需要开启全局事务的地方加上注解就行TCC模式:即Try-Commit-Cancel,自定义prepare逻辑、commit逻辑及回滚的逻......
  • 网格策略从1.0到1.1
    作者:麦克煎蛋  出处:https://www.cnblogs.com/mazhiyong/转载请保留这段声明,谢谢!在学习网格策略的过程中,困扰我的主要有两点:一个是建仓时机以及头寸大小。另一个是买卖策略。1.0版本在基础的网格策略,或者叫1.0版本中,建仓时机一般取的是网格的中段或稍低位置建仓,如15格的......
  • 普冉PY32系列(十五) PY32F0系列的低功耗模式
    目录普冉PY32系列(一)PY32F0系列32位CortexM0+MCU简介普冉PY32系列(二)UbuntuGCCToolchain和VSCode开发环境普冉PY32系列(三)PY32F002A资源实测-这个型号不简单普冉PY32系列(四)PY32F002A/003/030的时钟设置普冉PY32系列(五)使用JLinkRTT代替串口输出日志普冉P......
  • Oracle日志记录模式 - LOGGING、FORCE LOGGING、NOLOGGING模式介绍
    一、日志记录模式(LOGGING、FORCELOGGING、NOLOGGING)内容转载自:https://www.cnblogs.com/tk-bolg/p/12867772.html1.三者的含义LOGGING:当创建一个数据库对象时将记录日志信息到联机重做日志文件。LOGGING实际上是对象的一个属性,用来表示在创建对象时是否记录REDO日志,包括......
  • 运用ETL工具,实现慧穗云数据管理
    在数字化时代,数据已成为企业发展的核心驱动力。然而,许多企业在面对庞大的数据量和多样的数据源时,往往面临着数据整合和转换的难题。为了解决这一问题,慧穗云与ETL工具(Extract, Transform, Load),为企业提供全方位的数据管理解决方案。 首先,让我们来了解一下慧穗云,慧穗云致力于为......
  • PHP框架Laravel+Vue3+前后端分离开发模式+实战项目
    1、本实战项目采用前后端分离的开发模式,前端框架vue3,后端框架laravel10。所谓的前后端分离的开发,就是有别于利用cookie,session的基于会话机制的开发模式;前后端分离的开发模式是基于jwt的开发模式,也就是说后端的接口数据不仅可以支持web页面,也可以支持微信小程序,公众号,app等移动端......
  • 路由策略(普通路由,默认路由)和策略路由
    转自:https://blog.csdn.net/qingdao666666/article/details/114088829 路由策略和策略路由路由策略是根据一些规则,使用某种策略改变规则中/影响路由发布、接收或路由选择/的参数而改变路由发现的结果,最终改变的是路由表的内容。是在路由发现的时候产生作用。策略路由是尽管......
  • vi编辑器有几种模式?vi编辑器常用命令详解
    vi/vim是工作在字符终端环境下的全屏幕编辑器,因为编辑界面相对比较简单,并没有为用户提供鼠标操作和菜单系统,而是通过按键命令实现相应的编辑和操作功能。在vi编辑界面中可以使用三种不同的工作模式。分别是命令模式(Command mode),编辑模式(Insert mode)和末行模式(Last line mode)。......
  • 【发现一个小问题】golang http client: 配置了Client 对象的 Timeout 就会导致 conte
    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客zhihuGithub公众号:一本正经的瞎扯我这样初始化了客户端:varclient=http.Client{Timeout:time.Duration(1000)*time.Millisecond,}然后在request创建过程中使用了context的timeout机制:tim......
  • react中如何区分什么场景下应该使用useEffect,什么场景下应该使用发布订阅模式,进行通信
    在React中,useEffect和发布订阅模式(Pub/Sub)解决的是不同层面的问题,因此它们的使用场景也有所不同。useEffect的使用场景数据获取:当组件挂载后需要从服务器获取数据时,可以使用useEffect。同时,当依赖项发生变化时,它也能帮助重新获取数据。副作用处理:任何需要在渲染之外进行的......