因此,我应该让我的班级腰带能被两个观察者观察到,但我不确定该如何做以及到目前为止所找到的指南使我感到困惑。我难以解决的问题是如何放置这些可观察的方法。我遇到这个问题是因为问题要求我使用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
为其他对象提供了注册观察对象的机制。