如何创建具有多个(可互换)行为的类



我是Java的新手,我已经在以下方面苦苦挣扎了一段时间了。

我的项目中有这个"人类"类,作为我模型的一部分,我希望我的人类能够专业化,从而有新的行为。例如,我可以让一个人开始是"平民",但后来可以变成"士兵"并学习新的行为。

我曾经在 Smalltalk 中通过向我的"Human"类添加一个实例变量来做到这一点,该变量将指向"Civil"的实例,这样我就可以在游戏后期将其指向"士兵"的新实例,但现在在 Java 中我仅限于类型,我不确定如何处理它(我不认为为每个可能的类型添加一个实例变量是不可能的解决方案,但我可能是错的)。

那么,您将如何对此进行建模?关于我如何解决这个问题的任何提示将不胜感激!

您可以使用组合而不是继承。因此,人类内部将有一个代表其行为的变量。你可以称之为人类行为。扩展人类行为,创造士兵行为和文明行为。因此,您可以随时更改实例行为。只需做一个myHuman.setBehavior(new SoldierBehavior())或myHuman.setBehavior(new CivilBehavior());

class Human {
    Job job = new Civil();
}
interface Job {
    void work();
}
class Civil implements Job {
    void work() {
        cutDownTrees();
    }
}
class Soldier implemets Job {
    void work() {
        lookForEnemies();
    }
}

看起来你需要一个策略设计模式。

在您的情况下,您应该创建一个Behaviour接口,由类CivilSoldier实现:

public interface Behavior {
  void doSmthg();
}
public class Civil implements Behavior {
  void doSmthg(){ /* do it like a civil! */ }
}
public class Soldier implements Behavior {
  void doSmthg(){ /* do it like a soldier! */ }
}
public class Human {
  private Behavior behavior = new Civil();
  public void setBehavior(Behavior b) {
    this.behavior = b;
  }
}

在这种情况下,设计模式会派上用场。

您正在寻找对象的动态扩展,装饰器模式可帮助您处理它。另一个简单的方法是通过策略模式来做,其中士兵将是一种策略,民事将是一种策略,你将其添加到人对象中,现在这个人将成为士兵或平民等,

最新更新