2013-05-10 14 views
5

mam dużo instancji klasy MyClass i ALL mają reagować na jakiś wygenerowanego zdarzenia z innej klasy MyEventClass. Jak mam to zrobić?Wdrożenie słuchacza dla klasy zamiast instancji

Moją pierwszą myślą było określenie słuchacza w MyEventClass i wdrożyć go w MyClass, ale wymagałoby to dla każdej instancji MyClass aby ustawić słuchacza, a ponadto zdefiniowanie słuchacza jako tablicy w MyEventClass.
Dużo kodu/pracy.

Inną opcją Myślałem jest użycie transmisję w MyEventClass i odbiorników w MyClass, ale nie jestem pewien, może jest overkilling, a odbiorniki są rejestrowane, jak również (i nie zarejestrowani na onStop())

Trzeci opcją byłoby zdefiniowanie implementacji detektora dla klasy MyClass, nie dla każdej instancji, idealnie by pasowało, ale nie wiem, czy jest to w ogóle możliwe i jak mam go kodować.

Jeszcze jedna czwarta opcja po prostu wymyślił, jest wprowadzenie słuchacza w klasie dominującej MyClass i tylko ustawienie tej słuchacza w MyEventClass, następnie w pętli wystąpienia zdarzenia przez wszystkie MyClass instancji i ręcznie nazywają swoich słuchaczy. Dzięki temu mogę zarejestrować każdą instancję za pomocą MyEventClass.

Odpowiedz

0

StinePike ma rację w tym jednego postępowania, to jest bardzo standardowy problem napotykają podczas kodowania. Wzorzec Observer (lub Listener in Java) jest standardowym rozwiązaniem tego problemu. Powinieneś użyć swojej pierwszej propozycji, którą nazwałeś niejasnym, więc przedstawię ci ją na wypadek, gdy nie będę zbyt jasny.

Pozwól, aby MyEventClass oferował interfejs Listener, taki jak MyEventClassListener i dodawać/usuwać metody. Wtedy MyClass może dołączyć/odłączyć się jako słuchacze. Oto przykład kodu w przypadku trzeba go:

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(); 

} 

MojaKlasa.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

Więc nie ma przerwy dla leniwego programisty! – ilomambo

+0

Nie można uniknąć tego, czego nie można uniknąć :) –

3

myślę Observer design pattern będzie najlepszym wyborem ..

Wzorzec Obserwator jest wzorzec projektowania oprogramowania, w którym przedmiot, nazywa przedmiot, utrzymuje listę jego utrzymaniu, zwany obserwatorów, a powiadamia je automatycznie o wszelkich zmianach stanu, zwykle poprzez wywołanie jednej z ich metod. Stosowany jest głównie do realizacji rozproszonego zdarzenie systemy

z tysiącami innych linków można sprawdzić te link1, link2

+0

Czym różni się Observer od BroadcastReceiver? => Observer == Receiver, ObserverCollection == EventClass, notify() == sendBroadcast(), plus obserwatorzy muszą być zarejestrowani tak, jak odbiorcy. – ilomambo

+0

żadna koncepcja nie jest inna. sprawdź to https://sites.google.com/site/cliangusf/courses/mobile-programming/exploring-broadcast-receivers – stinepike

+1

Szczerze mówiąc, nie widzę różnicy, chociaż odpowiedź 0 mówi tak. mówi również * "Wzorzec obserwatora jest inny, podmiot rejestruje listę obserwatorów, a temat informuje wszystkich obserwatorów, kiedy nastąpiła zmiana." * co jest dokładnie tym, co można zrobić z BroadcastReceivers też, może BroadcastReceiver może zrobić więcej niż Observer-Pattern . W każdym razie jest to jedna z możliwych opcji, które opisuję, a ja polecam, abyś polecił w ten sposób innym, ważna rada, dziękuję. – ilomambo

Powiązane problemy