2

为了使我的问题更具体,让我将其作为一个问题提出:

情况描述:

我们有 3 个抽象概念:

Boss:  which has a number of employees
Worker:  that can execute some types of tasks
Task:  contains the semantics needed for a worker to execute it

在实现/子类型中,我们有许多不同类型的工作人员和不同类型的任务。特定类型的工作者可以执行某些类型的任务(所有类型的子集)

要解决的问题

现在老板有一个他希望执行的已知类型的任务,他不知道他拥有的工人类型(只有抽象类型/接口)。工人可以实现什么样的接口/老板可以做些什么来找出答案?

我能想到的解决方法

我找到了这两种方法,但可能还有其他更好的方法:

1)我们为每个实现空任务接口的任务类型创建一个类,给worker一个execute(task)函数:在execute(task)的实现中,尝试将任务类型检查/强制转换为该类型的worker可以执行的所有任务类型。如果没有任何类型检查通过,我们会抛出 taskNotSupportedException。老板现在可以将任务分配给工人,直到没有抛出异常。

2) 我们现在没有任务类,但使用函数 dotaskType(taskinfo) 为每个任务类型定义一个能力接口,一个工作实现现在可以根据其能力来实现能力接口。老板现在可以检查,直到找到具有适当能力的工人(类型检查),然后知道他可以执行任务给他。

我没有测试 2,我在 java 方面没有太多经验,但这应该是可能的(或非常相似的东西)。

我也更喜欢 2 而不是 1,因为 1 似乎不合适(强制转换的级联),并且接口是定义类实例可以做什么的自然方式,也可以使用接口对功能进行分组/创建层次结构。(同样在我当前的实现(1)中,Task 接口是空的,因此任务没有太多共同点,并且信息通过构造函数(这将是方法 2 中的函数的参数)传递并由 get 检索。

我想知道您将以什么其他方式/可以实施(调整 1 或 2?)这个或您更喜欢这两种方式中的哪一种以及为什么。(效率不重要,调制/抽象/可维护性才是!)

4

2 回答 2

2

不要为此使用异常。异常应该用于特殊情况,不能执行某些任务似乎是正常的。

我会添加一个方法

boolean isAbleToExecute(Task task)

在 Worker 类中,让老板遍历他的工人,并在分配之前找到一个能够执行任务的工人。

于 2011-04-28T17:14:15.513 回答
0

Worker 接口可以包括一个方法 supportedTasks 返回一个任务列表。然后,您可以维护一个 Map,将任务映射到支持该任务的工作人员列表。然后你的老板不需要迭代,而可以简单地查找支持给定任务的所有工人。

于 2011-04-28T17:50:21.833 回答