2011-12-27 3 views
1

Как я могу отправлять пользовательские события из одного объекта в другой?
У меня есть 2 рабочих объекта того же типа, основной класс использует работника. Если какое-либо условие истинно в work1, оно должно отправить событие 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();  
    } 
} 

ответ

2

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

0

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

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

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

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

2

Посмотрите, как 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); 
    } 
} 
Смежные вопросы