java - 我应该使用什么面向对象结构来描述动物的行为?

标签 java oop object-oriented-analysis

我有一项 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
}

但是,我想让它看起来更加面向对象,因为该类(class)旨在帮助我们获得更多的 OOP 技能。所以我的第二个选择是创建扩展 Dragon's Behaviour 抽象类的操作类,如下所示(大致):

龙.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 方式进行开发会更好。

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

我感谢所有的评论(:

最佳答案

您选择将不同的操作提取到具有公共(public)父类(super class)的类中是恕我直言合理的。但是,我会让 Dragon 类仅了解 DragonBehavior 抽象类,子类。这样您就可以添加和删除龙的行为,而无需实际更改它。

如何?看Chain-of-responsibility pattern - 每个行为在链条中都有其位置。如果行为决定激活自身(即执行某些操作),它可能会或可能不允许触发进一步的行为。此外,您可以删除行为(即使在运行时!)并重新排列它们以更改优先级(插入障碍比 sleep 更重要还是更不重要?)。

关于java - 我应该使用什么面向对象结构来描述动物的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7544404/

相关文章:

java 检查 Date 实例是否有时间部分

java - 安全地包装连接池

java - 在事务mysql中创建另一个连接

oop - 在 Smalltalk 中,当发送者和参数是不同类型时,定义可交换二进制方法的最佳方法是什么?

php - 从对象调用函数?

java - 如何查找HashMap中存储的Object

java - 查找对象的最快方法

java - Dagger 2 Android fragment

需要 Java 设计模式建议。 (具有静态参数和方法的处理程序)

java - 如何用不同的数据表示相似的对象