如何将多组实现中的一组附加到一个对象?

How to attach one of many sets of implementations to an object?

假设我正在为一组代理建模。这些代理可能由玩家或机器人控制。此外,每个 Agent 都有一个 Role - 例如 Explorer 或 Engineer。所有角色共享相同的通用操作,但每个角色执行操作的方式可能略有不同。理想情况下,您将能够调用 agentInstance.move(),并且操作将根据他们的角色进行。

一段时间以来,我一直在思考如何对此进行建模,并专门查看了 Strategy and Template 模式 - 但我不确定它们是否是我所需要的。

一种思路是让Player和Bot子类抽象Agent,让Explorer和Engineer子类抽象Role。然后每个代理都有一个角色。然而,这似乎意味着我必须像这样传递我的命令:agentInstance.getRole().move(),或创建像 agentInstance.move(){ this.role.move(); } 这样的辅助函数——这似乎有点不雅。

我也知道我的设计可能有点接口不足,所以我考虑将 Roles 建模为接口和子接口,默认实现然后由 Agent 继承,但这感觉像是一个解决方案有问题。

那么 - 对此建模的最佳方法是什么?哪些考虑因素对决策至关重要,尤其是 Java 8 接口和抽象 类 有多相似?

我会这样做:

  • 我将Role 设为接口,因为它没有属性。探索者和 工程师将 class 不是界面 b'coz 那是如何策略 有效。
  • 玩家和机器人将与代理相关联,以便他们可以发布 给代理的订单。

对我来说,在进行 OOP 分析和设计时有两个重要的考虑因素:

  • 它能解决我的问题吗?如果确实如此,请不要修复它!未来的问题 是为了未来。
  • 它必须尽可能容易重构。作为新要求 进来你将不得不做很多重构。