2

我有一个 Java 作业,我的教授要求我使用 LeJOS NXT 制作一个模拟某种动物行为的机器人。我选择发展一条龙。到目前为止,我提出的所有可能行为是:

  • 如果距离障碍物太近,转身。
  • 电池电量低时进入睡眠状态。
  • 如果触摸则推动物体。
  • 如果太亮,找一个暗点。
  • 等等

我现在很困惑,因为我不知道是在一个类中顺序开发它还是将所有龙的行为分成不同的类。请看我下面的解释。

而不是像这样在一个类中编写所有内容:

龙.java

public class Dragon {
   LightSensor ls = new LightSensor
   public static main(String args[]) {
       while (!BUTTON.Escape.IsPressed()) {
           if (this.closeToObject()) {
               this.turnAround();
           }

           // more conditions
       }
   }
   private boolean closeToObject() {
       //TODO
       return false;
   }
   private void turnAround() {
       //TODO
   }

   //... more methods
}

但是,我想让它看起来更面向对象,因为该课程旨在帮助我们获得更多的 OOP 技能。所以我的第二个选择是创建像这样(大致)扩展 Dragon's Behavior 抽象类的动作类:

龙.java

public class Dragon {
   Detect detect = new Detect();  // carry all the detection methods: distance, sound, etc.
   TurnAround turnAround = new TurnAround();
   public static main(String args[]) {
       while (!BUTTON.Escape.IsPressed()) {
           if (detect.tooCloseToObject()) {
               turnAround.prepare(); // beep beep alert
               turnAround.setDerection(true); // e.g. turn right
               turnAround.turn();
           }
       }
   }
}

DragonBehaviors.java

abstract class DragonBehavior {
    abstract void prepare();
    public void setDirection(boolean direction) {
        //...
    }
}

TurnAround.java

public class TurnAround extends DragonBehaviors {
    String direction;
    public void TurnAround() {}
    public void prepare() {
        // sound alert
    }
    public void setDirection(boolean direction) {
        if (direction) this.direction = "Right";
        else this.direction = "Left";
    }
    public void turn() {
        // TODO
    }
}

上面的代码大致是一个草稿,不要关注它。最后想问一下我对上面的OO结构的想法是否合理,否则在一个类中开发整个东西要容易得多,但这与OOP无关。我还有几个小组成员来完成代码,所以我认为如果我们共享类以 OOP 方式开发会更好。

在这种情况下我应该走哪条路?

我感谢所有评论(:

4

1 回答 1

4

恕我直言,您选择将不同的动作提取到具有共同超类的类中是合理的。但是我会让Dragon类只知道DragonBehavior抽象类,而不是子类。通过这种方式,您可以添加和删除龙的行为,而无需实际更改它。

如何?看看责任链模式——每个行为在链中都有它的位置。如果行为决定激活自己(即执行某事),它可能会或可能不会允许触发进一步的行为。此外,您可以移除行为(即使在运行时!)并重新排列它们以改变优先级(推动障碍比睡觉更重要还是更不重要?)。

于 2011-09-25T08:33:18.637 回答