使用ServiceLoader辅助责任链模式

Posted Mr.do

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用ServiceLoader辅助责任链模式相关的知识,希望对你有一定的参考价值。

 在项目中,常常会遇到这么一种场景,即对一批/一种/一堆数据,进行链式的处理。举个栗子,拿到一个task后,需要对这个task进行校验处理、状态变更处理、计算并回填数据处理等等各种处理,这种情况下,最适合的编码方式就是使用责任链了:

定义一个taskprocessor接口:

public interface TaskProcessor {

    boolean process(Task task, TaskConfigDTO config);

}

然后,再定义诸多的实现类,来进行处理,可以使代码更加优雅和便于扩展。下一点要考虑的就是在代码中,怎么加载/注入这些实现类呢 ?

(1)使用spring配置,对List<TaskProcessor> processors这个field字段使用XML注入list。

(2)使用java.util.ServiceLoader

在第二种方式下,由于不依赖于任何第三方,更加干净,且个人认为也更加优雅一点点。代码如下:

@Service
public class RetryTaskProcessorManager {

    private ServiceLoader<TaskProcessor> processors = ServiceLoader.load(TaskProcessor.class);

    public void process(Task task, TaskConfigDTO config) {
        for (TaskProcessor processor : processors) {
            boolean result = processor.process(task, config);
            if (!result) {
                break;
            }
        }
    }

}

同时,需要在resources/META-INF/services/接口全路径名的文件中,输入接口实现类的所有全路径名。如此,也能保证processor的处理顺序。

com.dianping.vc.retry.service.domain.impl.processor.task.TaskStatusProcessor
com.dianping.vc.retry.service.domain.impl.processor.task.MaxRetryCountProcessor
com.dianping.vc.retry.service.domain.impl.processor.task.NextExecuteTimeProcessor

 

以上是关于使用ServiceLoader辅助责任链模式的主要内容,如果未能解决你的问题,请参考以下文章

前端探索告别烂代码 用责任链模式封装网络请求

设计模式之责任链模式

(十五)责任链模式-代码实现

责任链模式

前端探索告别烂代码 用责任链模式封装网络请求

前端探索告别烂代码 用责任链模式封装网络请求