java - 为角色制作装备时子类太多(角色扮演游戏)

标签 java oop design-patterns uml abstract-factory

我正在构建一个小型角色扮演游戏。一个角色有多个属性,比如:力量、魔法、射箭和防御。玩家还可以穿戴装备,如 Helm 、躯干、腿、 Boot 、手套和武器。每件装备都有自己的统计数据。例如,银色躯干有 10 防御力。

当角色有,比如 15 防御,并且他穿着银色躯干,他的防御现在将是 25。无论如何,为了穿装备,它需要被生产。目前我用抽象工厂模式设计它(见图片)。

设计有很多类,其中大部分基本没用,比如青铜 Helm 银躯干等等,因为它们只有一个实例类统计。

因此,我的问题是:什么是生产装备的最佳方式,少一些更有用。由于它是针对学校项目的,因此我最好使用设计模式。 enter image description here

最佳答案

The design has a lot of classes, with most of them are basically useless, like Bronze Helmet, Silver Torso et cetera, because they only have an instance of the class Stats.

您似乎没有充分理由爆炸您的设计。整个层次结构可以只替换为一个名为 Equipment 的类。

public class Equipment {
    private Stats stats;
    private String equiptmentName;

    //constructors and getters and setters follow..
}

您的Player 类然后可以有SetEquipment,如下所示。无论何时安装或卸载设备,您都可以使用 Equipment 中的 stats 更新 Player 统计数据。

public class Player {
    private Set<Equipment> mountedEquipment;
    private Stats baseStats;

    public Player(Stats baseStats) {
       this.baseStats = baseStats;//set base stats for player
       mountedEquipment = new HashSet<Equipment>();
    }

    public void mountEquipment(Equipment equipment) { 
          baseStats.setMagic(baseStats.getMagic()+equipment.getStats().getMagic());

         //update base stats similarly for strength, hitpoints, etc
         mountedEquipment.add(equipment);

    }

    public void unmountEquipment(Equipment equipment) {

       baseStats.setMagic(baseStats.getMagic()-equipment.getStats().getMagic());
       //update base stats in a similar fashion for strength, hitpoints, etc
       mountedEquipment.remove(equipment);
    }

    public Set<Equipment> getMountedEquiptment() {
        return Collections.unmodifiableSet(mountedEquiptment);
    }

}

您实际上不需要您在问题中显示的任何Factory 类,因为您可以将所有可能的stats 添加到EquipmentPlayer 类,每当您引入新的 Equipment 类型时。

关于java - 为角色制作装备时子类太多(角色扮演游戏),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42352929/

相关文章:

r - 定义调用 R6 对象之外的其他方法的方法

oop - 允许值空间中存在多个 "no-value"值

面向对象设计 : Abstract class design vs Regular Inheritance

php - 我可以将 MVC 设计模式应用于过程 PHP

java - 使用 split() 数组索引越界后但在循环中读取数组

java - 使用 Karaf 的 features-maven-plugin maven 插件需要帮助... osgi

java - 具有 volatile 写入的本地内存可见性

java - 如何舍入 BigDecimal 以返回两位小数

c# - 用于在平面文件中对字段进行分组和结构化数据的设计模式

c# - 公共(public)属性(property)与静态只读