Создание и отправка пользовательских событий - PullRequest
1 голос
/ 27 декабря 2011

Как я могу отправлять пользовательские события из одного объекта в другой?
У меня есть 2 рабочих объекта одного типа, основной класс использует рабочий. если какое-либо условие истинно в worker1, оно должно отправить событие ea в основной класс, который переключит рабочих.

Это мой сценарий:

class Worker1 extends Base{
   public void DoSomeWork(Arg argument){
      if(someCondition=true){
          SendEvent();
      }
   }
}

class MainClassThatUsesWorker{
    Base worker = new Worker1();

    public void EventArrived(){
        worker = new Worker2();      
    }

    public void UseWorKer(){
        worker.DoSomeWork();      
    }
}

Ответы [ 3 ]

2 голосов
/ 27 декабря 2011

Посмотрите, как Swing и т. Д. Делают это.По сути, вы определяете класс события и интерфейс Listener, который реализуется основным классом (или каким-либо другим обработчиком).Затем вы регистрируете событие у отправителей, т.е. помещаете их в некоторую коллекцию, и когда событие запускается, вы перебираете эту коллекцию и вызываете метод обработки для слушателей.

Что-то вроде этого (упрощенно):

class MyEvent { ... };

interface MyListener {
  void handleEvent( MyEvent e );
}

//inside the worker class
public void SendEvent() {
  MyEvent e = new MyEvent();
  for( MyListener l : listeners ) {
    l.handleEvent( e );
  }
}
2 голосов
/ 27 декабря 2011

Я предлагаю вам реализовать шаблон наблюдателя .Тогда ваш основной класс - это наблюдатель, а работник - наблюдаемый (или субъект).Когда работник запускает соответствующее событие, ваш основной класс обрабатывает его соответствующим образом.Будьте осторожны с синхронизацией, потому что вы работаете с несколькими потоками.

0 голосов
/ 27 декабря 2011

Во-первых, соблюдайте соглашения об именах Java. Методы должны начинаться со строчной буквы.

Если вы хотите, чтобы главный объект был уведомлен, когда что-то происходит в работнике, работник должен иметь ссылку на главный объект:

public void doSomeWork(MainClassThatUsesWorker main) {
    if (someCondition) {
        main.eventArrived();
    }
}

Вы также можете принять других слушателей, кроме MainClassThatUsesWorker. В этом случае объявите интерфейс WorkerListener, имеющий метод eventArrived, и примите аргумент WorkerListener. MainClassThatUsesWorker должен будет реализовать этот интерфейс для прослушивания событий, запускаемых рабочим, но другие классы также могут реализовывать тот же интерфейс и передаваться в качестве аргумента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...