设计一个动物园,里面有笼子(cage),狮子(lion),老鼠(mice)等等,动物分成两类,一部分是食肉动物(carn),另外一部分是素食动物(herb),另外每个动物有捕食,被捕食列表。请问如何设计类素食动物阻止加入捕食列表,并且强制食肉动物必须加入捕食列表?

解决方案 »

  1.   

    如果要我设计的话:1。设计一个抽象类Animal  动作,其中可以定义抽象方法
    2。定义一个Carnivorous(肉食),和一个Phytozoon(素食) 继承至Animal类
    3。然后你要再定义动物的话,可以分别继承上面两个类  三代关系,不算太多,在设计中应该还是可以接受。  坐等楼下高见
      

  2.   

    interface FeedingHabits{
      
    }abstract class Animal{
       FeedingHabits feedingHabits; // 食性
    }class Carnivorous implements FeedingHabits{} //肉食
    class Phytozoon implements FeedingHabits{}  //素食
      

  3.   

    不明白,请问这样就可以禁止素食创建捕食列表,和强制肉食创建被捕食列表了? 然后animal 里面的Feeding habits 是用来做什么的?
      

  4.   

    我个人觉得这个东西可以简单一点设计,没必要搞那么复杂//首先,定义一个枚举类,用来标识动物的类型
    public enum FeedingHabits {
    CARNIVOROUS,
    PHYTOZOON  
    }
    import java.util.List;//定义动物类
    public abstract class  Animal {
           //类型
    private FeedingHabits habits;
    private String name;
           //生物链列表,被捕食,或者捕食
    private List<Animal> list;

    public abstract void run();
    public abstract void eat();



    public List<Animal> getList() {
    return list;
    }
    public void setList(List<Animal> list) {
    this.list = list;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public FeedingHabits getHabits() {
    return habits;
    }
    public void setHabits(FeedingHabits habits) {
    this.habits = habits;
    }
    }
    //最后定义一个笼子
    import java.util.ArrayList;
    import java.util.List;public class Cage { private double width;
    private double height;
    private double length;

    private List<Animal> list = new ArrayList<Animal>(); //装新动物
    public boolean  putAnimal(Animal a){
    if(list.size() == 0){
    list.add(a);
    return true;
    }
    for(Animal an : list){
    if(null != an.getList() && an.getList().contains(a)){
    return false;
    }else{
    list.add(a);
    }
    }
    return true;
    }

    public List<Animal> getAnimals(){
    return list;
    }


    public double getWidth() {
    return width;
    } public double getHeight() {
    return height;
    } public double getLength() {
    return length;
    }
    public void setWidth(double width) {
    this.width = width;
    } public void setHeight(double height) {
    this.height = height;
    } public void setLength(double length) {
    this.length = length;
    }}
      

  5.   

    大致看懂了,在setlist那里是不是还得判断下动物的食性,如果是素食的话就不能加入列表?
      

  6.   

    你没有发现,我的的Cage类,没有setList()方法??  个人觉得放动物进笼子是一个个的进去的,所以增加了putAnimal()  取消了setList()你实在要说一次加多个也可以,思想你可以参见putAnimal() 
      

  7.   

    1.素食动物类
    2.肉食动物类
    3.捕食关系类,其中有两个成员,一个成员是吃者,必须是肉食动物;另一个成员是被吃者。通过一个List或其它结构存储所有的捕食关系对象。
    在将两只动物放在同一个笼子时,检查用其构造的捕食关系是否存在,只有不存在才能放在一块儿。不过,到最后还是无法阻止一些不合常理的情况出现……
      

  8.   

    赞!个人小意见,不知是否合理?:
     //生物链列表,被捕食,或者捕食
        private List<Animal> list;
    这里用HashMap来代替List,被捕食或者捕食的动物作为Key值,而Value值作为标记被捕食或捕食;
    或者直接用两个List来区分被捕食列表和捕食列表。
    最后还应该重写add函数,根据动物类型(肉食、素食),素食动物不让添加