【发布时间】:2015-08-27 11:05:40
【问题描述】:
我正在用 Java 开发一个国际象棋程序并考虑以下问题:
- Rook 部件需要实现直线移动。
- Bishop 部件需要实现以沿对角线移动。
然而,
- Queen 棋子需要实现上述两种运动模式。
我想不出一个干净的解决方案来建模这种关系,我考虑过一些但没有一个既符合良好的面向对象设计和代码效率。
Java 不支持多重继承,所以 Queen 不能借用 Rook 和 Bishop 的实现
如果 Rook 和 Bishop 扩展 Queen,我需要将每种运动的逻辑提取到单独的方法中,这会严重影响我当前的运动验证设计。
上述解决方案似乎都不够优雅,无法击败:
- 将所有的运动实现放入所有部分的父类中,这样它们就可以共享所有的通用实现(其中相当多)
我知道解决方案 3 违反了良好的 Java 设计,但在这种情况下,这种设计模式似乎只是在强制解决臃肿、不优雅的解决方案。
也许这可以通过程序的完全重组来避免,但到目前为止一切对我来说看起来都非常有效,好的 OO 设计总是以功能和结构的直接性为代价吗?我的方法对语言的风格是错误的吗?
你会如何解决这个问题?
【问题讨论】:
-
在处理最终的、真正的实现时,我总是选择效率而不是好的标准等等。也就是说,正如已经建议的那样,您可以在其自己的类实例中将每个动作外部化,然后为每个部分提供它需要的动作。
-
不仅仅是子类化。使用接口和委托!
-
请记住,当前的设计指南建议优先考虑组合而不是继承。为什么没有直线和对角线移动生成器类并让棋子类使用它们?话虽如此,如果您在这里编写一个实际的播放引擎,那么请忘记物体的碎片并使用位板 - 您将需要它来提高速度。