2011-02-07 51 views
0

我正在實施一個負責所有來自黑莓的HTTP請求的類。我有大約10個左右的屏幕使用這個類來查詢Web服務並從中獲取數據。這種情況下使用的標準模式是什麼?黑莓設計模式問題:

目前,我有它設置如下 -

public class NetworkAccessClass 
{ 

    public NetworkAccessClass(String url, String methodName, Vector paramNames, Vector paramValues, MainScreen screen) { 
     // perform inits 
    } 

    public void run() { 
     // Get Data 
     if(screen.instanceOf(LoginScreen)) { 
      ((LoginScreen) screen).requestSucceded(responseData); 
     } 
     // So on for all 10 screens. 
     catch() { 
      ((LoginScreen) screen).requestFailed(errorCode); 
      // So on for all 10 screens. 
     } 
    } 

} 

它的工作原理,但看起來不正確的,如果一個屏幕上有多種類型的網絡請求,我被迫一個標誌添加到跟蹤它應該回撥哪個功能。

有沒有更好的方法來做到這一點?

謝謝,
Teja。

回答

3

使用回調界面,例如ResponseHandler

public class NetworkAccessClass 
{ 

    public interface ResponseHandler { 
     void requestSucceeded(ResponseData responseData); 
     void requestFailed(ErrorCode errorCode); 
    } 

    public NetworkAccessClass(
     String url, 
     String methodName, 
     Vector paramNames, 
     Vector paramValues, 
     ResponseHandler responseHandler) { 
     // perform inits 
    } 

    public void run() { 
     // Get Data 
     try { 
      ... 
      responseHandler.requestSuceeded(responseData); 
     catch() { 
      responseHandler.requestFailed(errorCode); 
     } 
    } 
} 

這有望從寂寂所有屏幕解耦您NetworkAccessClass。然後你的屏幕實現NetworkAccessClass.ResponseHandler或者他們通過一個適配器處理程序(匿名內部類)來調用屏幕上正確的方法,例如,

class LoginScreen { 
    ... 
     new NetworkAccessClass(url, methodName, paramNames, paramValues, 
      new ResponseHandler() { 
       @Override 
       void requestSucceeded(ResponseData responseData) { 
        LoginScreen.this.handleLoginSuccess(responseData); 
       } 
       @Override 
       void requestFailed(ErrorCode errorCode) { 
        LoginScreen.this.handleLoginFailure(errorCode); 
       } 
    } 
    ... 
} 
1

你可以使用一個監聽器,這是一個簡單的接口的網絡類將回調,每當一些有趣的事情發生了:

public interface NetworkListener { 
    void requestSucceeded(byte[] responseData); 
    void requestFailed(int errorCode); 
} 

public class NetworkAccess { 
    // ... 

    public void run() { 
     // Get Data 
     if (successful) { 
      fireSucess(responseData); 
     } 
     catch(SomeException e) { 
      fireFailure(errorCode); 
     } 
    } 

    public void addNetworkListener(NetworkListener listener) { 
     // add listener to list of listeners 
    } 

    private void fireSuccess(byte[] responseData) { 
     for (NetworkListener l : listeners) { 
      l.requestSucceeded(responseData); 
     } 
    } 

    // ... 
} 

public class LoginScreen { 
    private void foo() { 
     NetworkAccess access = new NetworkAccess(...); 
     access.addNetworkListener(new NetworkListener() { 
      public void requestSucceeded(byte[] responseData) { 
       // do what you want 
      } 
      public void requestFailed(int errorCode) { 
       // do what you want 
      } 
     }); 
    } 
} 

這就是所謂的可觀測/觀察者模式。觀察者在發生事情時通知其觀察者,但不必知道他們的確切類型。清單類將雙方分開。