因此,我应该让我的班级腰带能被两个观察者观察到,但我不确定该如何做以及到目前为止所找到的指南使我感到困惑。我难以解决的问题是如何放置这些可观察的方法。我遇到这个问题是因为问题要求我使用PlateEvent类的实例作为描述更改的对象。任何帮助都将非常有用,这里是问题和代码:

您需要修改Belt的此实现,以便它扩展java.util.Observable。每当将板子放在皮带上或从皮带上取下时,您都应安排将这种变化通知任何注册的观察员。使用PlateEvent的实例(如下所述)作为描述更改的对象。

PlateEvent定义了对象,当通知Belt的观察者已放置或移除板时,该对象将作为第二个参数传递给update()方法。在PlateEvent中,有一个名为EventType的枚举,它定义了两个符号:PLATE_PLACED和PLATE_REMOVED。 PlateEvent对象封装了这两种类型之一,即对放置或移除的板的引用以及发生这种情况的位置。您应该通读PlateEvent.java以确保您了解该类以及如何构造新实例,但是您无需在那里修改代码。

package a6adept;

import java.util.NoSuchElementException;

import comp401.sushi.Plate;

public class Belt extends java.util.Observable {

    Plate[] belt;

    public Belt(int size) {
        if (size <= 0) {
            throw new IllegalArgumentException("Illegal belt size");
        }

        belt = new Plate[size];
    }

    public int getSize() {
        return belt.length;
    }

    public Plate getPlateAtPosition(int position) {
        return belt[correct_position(position)];
    }

    public void setPlateAtPosition(Plate plate, int position) throws BeltPlateException {
        if (plate == null) {
            throw new IllegalArgumentException();
        }

        if (getPlateAtPosition(position) != null) {
            throw new BeltPlateException(position, plate, this);
        } else {
            belt[correct_position(position)] = plate;
        }
    }

    public void clearPlateAtPosition(int position) {
        belt[correct_position(position)] = null;
    }

    public Plate removePlateAtPosition(int position) {
        Plate plate_at_position = getPlateAtPosition(position);
        if (plate_at_position == null) {
            throw new NoSuchElementException();
        }
        clearPlateAtPosition(position);
        return plate_at_position;
    }

    public int setPlateNearestToPosition(Plate plate, int position) throws BeltFullException {
        for (int offset=0; offset < getSize(); offset++) {
            try {
                setPlateAtPosition(plate, position+offset);
                return position+offset;
            } catch (BeltPlateException e) {
            }
        }
        throw new BeltFullException(this);
    }

    public void rotate() {
        Plate last_plate = belt[getSize()-1];
        for (int i=getSize()-1; i>0; i--) {
            belt[i] = belt[i-1];
        }
        belt[0] = last_plate;
    }

    private int correct_position(int position) {
        if (position < 0) {
            return ((position%getSize())+getSize())%getSize();
        }
        return position%getSize();
    }

}


package a6adept;

import comp401.sushi.Plate;

public class PlateEvent {
    public enum EventType {PLATE_PLACED, PLATE_REMOVED};

    private EventType type;
    private Plate plate;
    private int position;

    public PlateEvent(EventType type, Plate plate, int position) {
        this.type = type;
        this.plate = plate;
        this.position = position;
    }

    public EventType getType() {
        return type;
    }

    public  Plate getPlate() {
        return plate;
    }

    public int getPosition() {
        return position;
    }
}

最佳答案

每当将板放置在皮带上或从皮带上卸下时,都需要构造具有适当属性的PlateEvent对象,然后调用notifyObservers(plateEvent)

您无需执行其他任何操作,因为Observable为其他对象提供了注册观察对象的机制。

08-06 05:22