【发布时间】:2020-08-30 09:40:18
【问题描述】:
我正在用 Java 开发一个像吃豆人这样的游戏,我目前正面临这些我不喜欢的代码味道。
让我解释一下我的想法:我的游戏是建立在 MVC 架构上的。在视图模块上,我查找模型上的每个电源,并将其添加到要在 GUI 上绘制的元素列表中。问题是我有 3 种使用接口的加电装置,所以当我添加加电装置时,我需要检查它们是什么类型,然后添加对应的视图。让我显示一些代码,以便我更清楚:
for (PowerUp powerUp : level.getPowerUps()) {
if (powerUp instanceof Invincibility) elements.add(new InvincibilityView(powerUp.getPosition()));
if (powerUp instanceof Freeze) elements.add(new FreezeView(powerUp.getPosition()));
if (powerUp instanceof Fright) elements.add(new FrightView(powerUp.getPosition()));
}
第二个气味和鬼有关,我的游戏有一个State Pattern,如果状态改变,它应该改变鬼的颜色。例如,如果状态是Frightened,我希望鬼是橙色,如果状态是Frozen,我希望鬼是蓝色,等等。
因此,在创建 Ghost 视图时,我通过参数传递状态,它会检查(再次使用 instanceof)当前处于什么状态。让我再展示一些代码:
public void draw(graphics) {
String color = "#FF0000";
if (state instanceof Invincible) color = "#585858";
if (state instanceof Frozen) color = "#00FFFF";
if (state instanceof Frightened) color = "#FF7F50";
// draw ghost
}
我的问题是如何在不更改模型模块的情况下避免使用instanceof。
保持安全!
【问题讨论】:
-
您可能正在寻找一个抽象工厂。请注意,
ViewFactory可以有一个方法canHandlePowerup(PowerUp),然后您可以遍历工厂列表以找到处理特定上电的工厂并请求查看。 -
您是否尝试过使用接口来执行操作并使用枚举来获取颜色?
-
我尝试了@chrylis-onstrike-指出的解决方案,我现在为每个ghost 和powerUp 视图提供了工厂,以及一个从列表中选择正确工厂的FactoryProducer。这确实是我一直在寻找的,我现在有很多新文件,但只需添加新工厂,代码就可以轻松扩展。谢谢。
标签: java oop model-view-controller refactoring instanceof