我决定使用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
}
这里的“Status”是一种枚举:
public enum Status {
NORMAL,
BURNT,
POISONED,
HEALED,
FROZEN
}
我希望让我的代码灵活易修改,并且想要遵循SOLID原则,有效地运用必要的设计模式。
假设我想要自定义我的角色,允许创建自定义角色扩展来仅具有某些状态更改。例如,我将创建一个名为“Monster”的怪物。
public class FireGolem extends Monster{...}
该技术与IT相关,涉及内容如下:
创建能够抵御高温(因此不会燃烧)的类。我有两个想法:
1) 为Character类创建一个Set,其中指定Character可以具有哪些状态更改。
2) 创建不同的接口(Burnable、Freezable等),需要时再实现它们。
你认为哪种方法更好?为什么?是否有更好和更干净的选项?
提前感谢您的回答。
super.setStatus
的前提条件可能会被Status.BURNT.equals(status)
加强,但这不会影响程序的正确性,这是这个原则的主要思想。仅仅因为一个程序没有(完全)遵循SOLID或者“我将写这个程序只是为了遵循SOLID”而说它是不正确或者设计不良是有点愚蠢的。顺便说一下,我的代码片段并不是纯粹的SOLID演示,它只是我认为合理的一种方法。 - Andrew TobilkoclearStatus(List<Monster>)
试图清除在Monster
级别支持的所有潜在状态呢?控制流将退出,这可能是不希望的,因为它会使其他尚未处理其状态的怪物仍然启用。您需要跳过障碍以确保正确性。 - Dioxinmonsters.forEach(m -> m.setStatus(null));
,有什么问题吗? - Andrew Tobilko