假设有一个 ArrayList 包含许多不同类型的“元素”元素。所有这些都将无限循环地绘制到屏幕上。
这些“元素”可以实现 0..n 个接口,如“可移动”、“可选”等。
到目前为止,我尝试的是遍历所有元素并检查以下接口:
ArrayList<Element> allElements;
...
for (Element element : allElements) {
if (element instanceof Movable) {
((Movable)element).move();
}
if (element instanceof Selectable) {
...
}
element.draw();
}
不过,我对这种方法并不满意,因为它违反了开放/封闭原则(可能还有数千条其他原则)。当然,我可以重新设计它,以便每个元素根据它实现的接口做出响应:
for (Element element : allElements) {
element.move(); // element checks itself if it can move, and if true moves
...
}
缺点是 Element 类必须为每个可能的行为提供签名,即它必须提供每个接口的方法,并且可能在子类中覆盖它们。这也不是我想要的,因为它使 Element 类膨胀。
我还尝试通过这样的界面选择元素:
getElementsByInterface(Movable, allElements) { ... }
(Movable是接口,allElements是ArrayList)
但它不编译。似乎 Java 在运行时不再知道接口。
长话短说(抱歉我的帖子可能过于冗长):让数组元素根据其能力(/接口)做出反应的最佳设计解决方案是什么?