2013-05-10 2 views
5

У меня есть много экземпляров класса MyClass и они ALL должны реагировать на некоторые события, генерируемых из другого класса MyEventClass. Как мне это сделать?Реализовать слушатель для класса, а не экземпляр

Моя первая мысль была определить слушателя в MyEventClass и реализовать его в MyClass, но это потребовало бы для каждого экземпляра MyClass, чтобы установить слушателя, и в дополнение, чтобы определить слушателя как массив в MyEventClass.
Много кода/работы.

Другого варианта я думал, чтобы использовать трансляцию в MyEventClass и приемниках в MyClass, но я не уверен, может быть, это overkilling и приемники должны быть зарегистрированы, а также (и незарегистрированные на onStop())

Третий опция должна была бы определить реализацию слушателя для класса MyClass, но не для каждого экземпляра, это идеально подойдет, но я не знаю, возможно ли это вообще и как мне его кодировать.

Но четвертый вариант я просто придумал, чтобы реализовать слушатель в родительском классе MyClass и только установка этого слушателя в MyEventClass, то на петле наступления события через все MyClass экземпляров и вручную вызвать свои слушатель. Это позволяет мне регистрировать каждый экземпляр с помощью MyEventClass.

ответ

0

StinePike прямо на этом, это очень стандартная проблема столкнуться при кодировании. Образец Observer (или Listener in Java talk) является стандартным решением для этого. Вы должны использовать свое первое предложение, которое вы сформулировали как непонятное, поэтому я выложу его для вас, если я не буду слишком ясен.

Позвольте MyEventClass предложить интерфейс прослушивателя, например MyEventClassListener, и добавить/удалить методы. Затем MyClass может присоединяться/отсоединяться как слушатели. Вот пример кода в случае, если вам это нужно:

MyEventClass.java

public class MyEventClass { 

    private Set<MyEventClassListener> listeners = new HashSet<MyEventClassListener>(); 

    // Your code here... 

    public void addListener(MyEventClassListener listener) { 
     listeners.add(listener); 
    } 

    public void removeListener(MyEventClassListener listener) { 
     listeners.remove(listener); 
    } 

    public void notifyListeners() { 
     for (MyEventClassListener listener : listeners) { 
      listener.somethingHappened(); 
     } 
    } 

} 

MyEventClassListener.java

public interface MyEventClassListener { 

    public void somethingHappened(); 

} 

MyClass.java

public class MyClass implements MyEventClassListener { 

    MyEventClass myEventClass; 

    // Your code here.. 

    public void someFunction() { 
     // Add as listener 
     myEventClass.addListener(this); 
    } 

    @Override 
    public void somethingHappened() { 
     // Act on callback 
    } 

} 
+0

Итак, нет перерыва для ленивого программиста! – ilomambo

+0

Вы не можете избежать того, чего не можете избежать :) –

3

Я думаю Observer design pattern будет ваш лучший выбор ..

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

с тысячами других ссылок вы можете проверить эти link1, link2

+0

Как наблюдатель отличается от BroadcastReceiver? => Observer == Receiver, ObserverCollection == EventClass, notify() == sendBroadcast(), плюс наблюдатели должны быть зарегистрированы так же, как приемники. – ilomambo

+0

нет концепция отличается ... проверьте это https://sites.google.com/site/cliangusf/courses/mobile-programming/exploring-broadcast-receivers – stinepike

+1

Честно говоря, я не вижу разницы, хотя ответ 0 так говорит. он также говорит: «Образец наблюдателя отличается, субъект регистрирует список наблюдателей, и субъект информирует обо всех наблюдателях, когда происходит изменение». * Это именно то, что можно сделать с помощью BroadcastReceivers, возможно, BroadcastReceiver может делать больше, чем Observer-Pattern , В любом случае, это один из возможных вариантов, которые я описываю, и я беру вас за то, чтобы вы рекомендовали это другим, действующий совет, спасибо. – ilomambo