在Java中使用observer类

时间:2014-11-10 23:46:46

标签: java

所以我应该让两个观察者观察我的班级腰带,但是我不知道怎么做这个,我到目前为止找到的指南让我很困惑。我难以理解的问题是在哪里放置这些可观察的方法。我有这个问题,因为问题要求我使用类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;
    }
}

2 个答案:

答案 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类型,这是您在应用中创建的事件,表示传递的事件以表示更改。