Я в процессе переноса программы на C # на Java, в которой интенсивно используются делегаты, и метод делегата BeginInvoke
для асинхронного уведомления о событии. Возьмем, к примеру, поток передачи данных. Возможно, ему придется уведомить другой рабочий поток о своем состоянии, а также о графическом интерфейсе.
Мне кажется, что лучший способ уведомить о различных событиях для разных классов - это иметь интерфейс IClassNameHereWatcher
, который определяет все типы событий, о которых класс "публикует" событие, о которых нужно будет уведомлять тогда каждый класс, который должен прослушивать, реализует этот интерфейс и регистрируется как слушатель. Я не совсем уверен, как сделать это асинхронным. Вот примерно то, что я имею в виду:
public interface IFrobWatcher {
void frobDidSomething();
void frobReceivedData(object data);
}
public class Frob implements Runnable {
List<IFrobWatcher> watchers = new ArrayList<IFrobWatcher>();
private void run() {
while (true) {
// Long running task
if (blah) notifyWeDidSomething();
notifyOfData(someDataObject);
}
}
public void addWatcher(IFrobWatcher watcher) {
watchers.Add(watcher);
}
private void notifyWeDidSomething() {
for (IFrobWatcher watcher : watchers) {
watcher.frobDidSomething(); // How do I make this asynchronous?
}
}
private void notifyOfData(object someDataObject) {
for (IFrobWatcher watcher : watchers) {
watcher.frobReceivedData(someDataObject); // How do I make this asynchronous?
}
}
}
public class FrobWatcher implements IFrobWatcher {
private Frob frobToWatch;
public FrobWatcher(Frob frob) {
frobToWatch = frob;
frobToWatch.addListener(this);
}
public void FrobDidSomething() {
System.out.println("Frob did something!");
}
public void FrobReceivedData(object received) {
System.out.println("Frob received: " + received.ToString());
}
public static void main(string[] args) {
Frob f = new Frob();
FrobWatcher fw = new FrobWatcher(f);
(new Thread(f)).start();
}
}
И это довольно упрощенный пример, но, надеюсь, он передает то, что я ищу. Если что-то не понятно или не имеет смысла, пожалуйста, прокомментируйте, и я постараюсь прояснить или исправить пример.