2009-09-25 14 views
10

Mam klasę o nazwie CommunicationManager, która jest odpowiedzialna za komunikację z serwerem.Jak realizować wywołania zwrotne w Javie

Obejmuje metody login() i onLoginResponse(). W przypadku logowania użytkownika należy wywołać metodę login(), a gdy serwer odpowie, zostanie wykonana metoda onLoginResponse().

Co chcę zrobić, to powiązać działania z interfejsem użytkownika. W klasie GUI stworzyłem instancję CommunicationManager o nazwie mCommunicationManager. Od klasy GUI metoda login() jest nazywana po prostu linią

mCommunicationManager.login(); 

Co nie wiem, jak to zrobić jest wiążąca metodę z klasy GUI do onLoginResponse(). Na przykład, jeśli klasa GUI zawiera metodę notifyUser(), która wyświetla komunikat otrzymany z serwera.

będę naprawdę wdzięczny jeśli ktoś może pokazać, jak związać metody w celu realizacji metody z klasy GUI (np. GUI.notifyUser()), gdy instancja klasy mCommunicationManager odbiera wiadomości z serwera i sposobu CommunicationManager.onLoginResponse() jest wykonywany.

Dzięki!

+0

dlaczego nikt nie powiedział o http wywołania tej funkcji zwrotnej, która obejmuje swing? – gumuruh

+0

Pytanie od nowicjusza. Dlaczego można wykonać System.out.print (mCommunicationManager.login()); (załóżmy, że drukowanie wiadomości z serwera jest zadaniem)? Rozumiem przypadek użycia w modelu wielowątkowym, ale nie mogę wizualizować scenariusza logowania w modelu wielowątkowym. – user3388324

Odpowiedz

25

Są tu dwa wzory, które widzę, że używasz. Jednym z nich jest publish/subscribe or observer pattern wspomniany przez Pete'a. Myślę, że to jest prawdopodobnie to, czego chcesz, ale widząc, jak pytanie wspomina o wiązaniu metody do późniejszej realizacji, pomyślałem, że powinienem wspomnieć o Command pattern.

Wzorzec poleceń jest po prostu obejściem, ponieważ java nie traktuje metod (funkcji) jako obiektów pierwszej klasy i dlatego nie można ich przekazać.Zamiast tego tworzysz interfejs, który może być przekazywany i zawiera informacje niezbędne do wywołania oryginalnej metody.

Tak dla przykładu:

interface Command { 
    public void execute(); 
} 

a następnie przekazać w instancji tego polecenia podczas wykonywania funkcji login() (niesprawdzone, zawsze zapominam jak dostać anonimowych klas prawej):

final GUI target = this; 
command = new Command() { 
    @Override 
    public void execute() { 
     target.notifyUser(); 
    } 
}; 
mCommunicationManager.login(command); 

I w funkcji logowania() (menedżer zapisuje odwołanie do polecenia):

public void login() { 
    command.execute(); 
} 

edytuj: Powinienem chyba wspomnieć, że chociaż jest to ogólne wyjaśnienie, jak to działa, w Javie jest już trochę hydraulika do tego celu, a mianowicie ActionListener i powiązanych klas (actionPerformed() jest w zasadzie execute() w Command). Są one przeznaczone głównie do użytku z klasami AWT i/lub Swing, a zatem mają cechy specyficzne dla tego przypadku użycia.

3

Idiom używane w języku Java, aby osiągnąć zachowanie oddzwaniania jest słuchaczy. Skonstruuj interfejs z metodami dla pożądanych zdarzeń, posiada mechanizm do rejestrowania obiektu słuchacza wraz ze źródłem zdarzeń. Kiedy wystąpi zdarzenie, wywołaj odpowiednią metodę na każdym zarejestrowanym detektorze. Jest to typowy wzorzec dla zdarzeń AWT i Swing; dla losowo wybranego przykładu zobacz FocusListener i odpowiedni obiekt FocusEvent.

pamiętać, że wszystkie wydarzenia w Java Swing i AWT dziedziczy ostatecznie od EventObject i konwencja jest wywołanie słuchacza SomethingListener a zdarzenie SomethingEvent. Chociaż możesz wymyślić nazwę swojego kodu, jak chcesz, łatwiej jest zachować kod, który pasuje do konwencji platformy.

Powiązane problemy