我会尽量简要介绍问题...
线程池执行链式任务。每个任务都继承自一个抽象类。他们中的大多数都处理外部服务,需要根据服务进行定制。每个任务都将包含一个对象或对象列表,我们将其称为TaskObjects,尽管它们可以是String,Integer,MyClass等。当任务完成时,它会将TaskObject和其他数据放入响应集合中对象并传递它。当任务链完成时,集合将返回到主线程。
主线程将评估响应并根据这些响应确定要采取的操作。这些可能是立即操作(即,拉动TaskObject,操纵它们,并将结果放入新任务以便在下一个可用线程上执行),或者可能需要累积该类型的N个响应以触发操作(即,拉动TaskObject,可能操纵它们,并将它们放在本地集合中。如果N个TaskObject(s)在M时间内在该集合中建立,则对这些TaskObject采取动作)。操作也可能基于响应集合中其他任务的响应发生位置,因此响应无法单独处理。
我面临的问题是处理不同的TaskObjects。它们不从任何共享类继承(当然,除了Object)。多态性无济于事。主线程评估的性质使事情复杂化。我正在考虑各种选择,但没有一个看起来非常“好”......
我不确定是否有一种“好”的方式来处理这类事情。 Java中的一般问题并不是很独特,但这种特殊的困境可能会更加困难。也许没有干净的方法来处理这个问题,我只需要重构一下并实现最不好的解决方案。
然后,我可能会让事情过于复杂,而且更好的选择就是坐在我的鼻子底下......
答案 0 :(得分:0)
在您的描述中,在我看来,您有两个可以看到各种任务的地方:任务层次结构本身和主线程中的响应处理。这意味着添加新任务可能需要在这两个地方进行更改,这会降低您的代码的灵活性。
我想知道你是否可以在一个地方封装这个品种。一种想法是使用策略模式:在这种情况下,策略将定义处理逻辑,这取决于整个响应集合。特定的Task类只保留对策略的引用。这还需要使用一种方法ITask
创建类似getProcessingStrategy()
的界面。在您的情况下,战略界面需要能够适应您复杂的处理方案(例如execute(Collection<IResponse>)
)。
最终,您将拥有一个任务类层次结构和一些独立的处理策略。每个任务类都将指定要使用的策略。添加新任务类需要决定使用哪种策略来处理任务响应。