无法从Observable注销

时间:2019-05-09 06:01:18

标签: java observer-pattern

我是java和学习Observer模式概念的新手。我能够成功创建和使用Observer和Observable,但是不确定如何注销Observer。请在下面找到代码。

我有一个RandomGenerator类,该类生成0-10之间的随机数。此类扩展了Observable,我有一个Subsriber类,它扩展了Observer,它想“监听” RandomGenerator,并专门查找大于5的数字。在我的主要方法中,我实例化了RandomGenerator对象和2个将其自身注册到RandomGenerator的订户对象。 Subsriber对象收到大于5的数字通知,但我没有获得如何注销其中一个订户对象并重新测试观察者模式的

public class RandomGenerator extends Observable{
public int num;
public void generateNums() {

    for(int ii=0; ii<10; ii++) {
        num = (int) (Math.random() * 10);
        if(num >= 5) {
            setChanged();
            notifyObservers();
        }
        else {
            System.out.println("less than 5"+num);
        }
    }
}
}
// Subscriber
public class Subscriber implements Observer{

RandomGenerator observable;

public Subscriber(RandomGenerator observable)
{
    this.observable = observable;
    observable.addObserver(this);
}
@Override
public void update(Observable obj, Object arg) {
    if(obj instanceof RandomGenerator) {
        RandomGenerator gen = (RandomGenerator)obj;
        System.out.println(gen.num);
    }   
}

}

 //Main method
public class Invoker {
public static void main(String[] args) {
    RandomGenerator gen = new RandomGenerator();
    Subscriber ss1 = new Subscriber(gen);
    Subscriber ss2 = new Subscriber(gen);
    gen.generateNums();
            // how to de-register ss1 and call gen.generateNums();  
}
}

1 个答案:

答案 0 :(得分:0)

将以下方法添加到订阅服务器。

public void disconnect() {
    observable.deleteObserver(this);
}

以供参考:https://docs.oracle.com/javase/8/docs/api/index.html?java/util/Observable.html