我应该用什么OO结构来描述动物的行为?

时间:2011-09-25 08:15:33

标签: java oop object-oriented-analysis

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

  • 如果它太靠近障碍物,请转身。
  • 电池电量不足时进入睡眠状态。
  • 触摸时推动物体。
  • 如果太亮,找个黑点。

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

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

Dragon.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的行为抽象类的动作类:

Dragon.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方式开发的类可能会更好。

在这种情况下,我应该采用哪种方式?

我感谢所有评论(:

1 个答案:

答案 0 :(得分:4)

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

如何?看看Chain-of-responsibility pattern - 每个行为都在链中。如果行为决定激活自己(即执行某些操作),则可能会或可能不会允许触发进一步的行为。此外,您可以删除行为(即使在运行时!)并重新排列它们以更改优先级(正在推动障碍物或多或少比要睡觉?)。