所以我应该让两个观察者观察我的班级腰带,但是我不知道怎么做这个,我到目前为止找到的指南让我很困惑。我难以理解的问题是在哪里放置这些可观察的方法。我有这个问题,因为问题要求我使用类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;
}
}
答案 0 :(得分:2)
任何时候在皮带上放置或移除印版,您需要构建具有适当属性的PlateEvent
对象,然后调用notifyObservers(plateEvent)
。
您不需要做任何其他事情,因为Observable
提供了其他对象注册以观察对象的机制。
答案 1 :(得分:1)
您的代码显示的是Belt extends Observable
。其余部分来自javadoc:
/**
Adds an observer to the set of observers for this object, provided that it is not the same as some observer already in the set.
*/
public void addObserver(Observer o)
所以你需要将它们添加到一个集合中。为什么?因此,当皮带上有东西时,你可以告诉他们。怎么样?看看它的javadoc:
/**
This method is called whenever the observed object is changed. An application calls an Observable object's notifyObservers method to have all the object's observers notified of the change.
*/
void update(Observable o, Object arg)
因此,您需要在更改内容时调用update。什么?阅读问题:发送一个事件告诉它发生了什么?怎么样?核心java API不知道您的问题是什么它让您发送Object
类型,这是您在应用中创建的事件,表示传递的事件以表示更改。