Один наблюдатель с несколькими наблюдаемыми - PullRequest
0 голосов
/ 18 мая 2019

Я хотел бы знать, какова будет реализация в отношении схемы проектирования наблюдателя.Как и обычно, мы поддерживаем список наблюдателей в Observable, и из его уведомления мы называем метод обновления наблюдателей.

Теперь, каков будет дизайн в этом случае?Должен ли я вести список наблюдаемых у наблюдателей?Но тогда в методе обновления, как я узнаю, какая наблюдаемая вызывает обновление для этого наблюдателя.

Пожалуйста, поделитесь своей идеей по этому поводу.

Спасибо,

1 Ответ

0 голосов
/ 19 мая 2019

Обычно наблюдаемые содержат ссылку на наблюдателя. в вашем случае это может быть список. в любом случае первым аргументом для обновления является наблюдаемый.

Так что это один из способов:

import java.util.Observable;
import java.util.Observer;
enum Observables {
    o1,o2
}
class MyObservable extends Observable {
    public MyObservable(Observables observables) {
        this.observables=observables;
    }
    public void setChangedAndNotify(Object object) {
        setChanged();
        notifyObservers(object);
    }
    final Observables observables;
}
class MyObserver implements Observer {
    @Override public void update(Observable o,Object arg) {
        switch(((MyObservable)o).observables) {
            case o1:
                System.out.println(((MyObservable)o).observables);
                break;
            case o2:
                System.out.println(((MyObservable)o).observables);
                break;
        }
    }
}
class so56200126_single_observer_with_multiple_observable {
    public static void main(String[] args) throws InterruptedException {
        MyObservable myObservable1=new MyObservable(Observables.o1);
        MyObservable myObservable2=new MyObservable(Observables.o2);
        MyObserver myObserver=new MyObserver();
        myObservable1.addObserver(myObserver);
        myObservable2.addObserver(myObserver);
        myObservable1.setChangedAndNotify(null);
        myObservable2.setChangedAndNotify(null);
        Thread.sleep(1);
    }
}
...