为了使我的问题更具体,让我将其作为一个问题提出:
情况描述:
我们有 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?)这个或您更喜欢这两种方式中的哪一种以及为什么。(效率不重要,调制/抽象/可维护性才是!)