Cso*_*agy 5 java oop design-patterns
我决定使用Java构建类似于rpg的坚固游戏结构来练习设计模式。
基本上,我的游戏中存在不同类型的角色,这些角色均被视为“游戏对象”,具有一些共同的特征:
public abstract class Character extends GameObject {
Status status;
//fields, methods, etc.
}
public abstract class Monster extends Character{
//fields, methods, etc
}
public class Hero extends Character {
//fields, methods, etc
}
Run Code Online (Sandbox Code Playgroud)
这里的状态是一个枚举:
public enum Status {
NORMAL,
BURNT,
POISONED,
HEALED,
FROZEN
}
Run Code Online (Sandbox Code Playgroud)
我想使我的代码灵活,易于修改,并且我想有效地使用必要的设计模式来遵循SOLID原则。
假设我要自定义字符,允许创建自定义的字符扩展名,从而仅允许某些状态更改。例如,我将创建一个名为
public class FireGolem extends Monster{...}
Run Code Online (Sandbox Code Playgroud)
,它不会因热而损坏(因此无法燃烧)。
我有2个想法可以做到这一点:
1)为角色类创建一个Set,在其中我将指定角色可以进行哪种状态更改
2)创建不同的接口(Burnable,Freezable等),并在必要时实施它们。
你怎么看?哪个更好?为什么?有没有更好更好的选择?
先感谢您。
我想你可能要考虑反其道而行之。
一般来说,大多数角色都是可燃烧、可冻结等。
因此,不要为角色可以拥有的各种状态创建一组,而是为角色创建一个免疫组。
这将允许您处理父类(角色)中的免疫,因此在创建新怪物时,您所要做的就是在其构造函数中为其添加免疫,一切都会很好,而无需重写任何方法。
让我们看看这在您的示例中如何工作。
哦,但在此之前,简短的警告:我将称你的状态为“燃烧”而不是“燃烧”,只是因为我假设具有该状态的角色实际上仍在燃烧;)
public abstract class Character extends GameObject {
Status status;
ArrayList<Status> immunities = new ArrayList<>();
//fields, methods, etc.
public void addImmunity(Status immunity) {
immunities.add(immunity);
}
// return false if the status couldn't be set in case you want to do something
// like show an "Immune!" message or something like that
public boolean setStatus(Status status) {
if (immunities.contains(status)) {
return false;
}
this.status = status;
return true;
}
}
class FireGolem extends Monster {
public FireGolem() {
addImmunity(Status.BURNING);
}
}
Run Code Online (Sandbox Code Playgroud)
这种方法的好处是,从长远来看,您将节省大量内存。而且您不必过度设计任何东西。现在...无论您是否使用 ArrayList 还是其他东西,这当然是有争议的,这只是一个简单的例子。
此外,setStatus 方法在这里返回一个布尔值作为结果。我不抛出异常的原因是因为我根本不认为它是一个异常。为什么玩家不尝试点燃火焰傀儡?当然,它不应该起作用,但这仍然是预期的情况之一。话又说回来,不同的人使用不同的方法,在这里抛出异常当然没有什么完全错误,只是对我个人来说,感觉不太对。如果您想要更多信息而不是出于可视化目的的简单 true 或 false,您可以返回更复杂的对象,但我想让示例尽可能简单。
还有一件事需要补充:也许你还应该考虑给角色一个状态列表,而不是一个单一的状态,因为虽然冻结和燃烧可能会相互抵消,但我确实认为有可能同时燃烧和中毒,但这只是一个见仁见智。有很多游戏一次只允许一个状态。
| 归档时间: |
|
| 查看次数: |
158 次 |
| 最近记录: |