Вопрос о дизайне Blackberry: - PullRequest
0 голосов
/ 08 февраля 2011

Я реализую класс, который отвечает за все мои HTTP-запросы от Blackberry.У меня около 10 или около того экранов, которые используют этот класс для запроса веб-службы и получения данных из нее.Какой будет стандартный шаблон для использования в этом случае?

В настоящее время у меня есть его настройки следующим образом -

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

}

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

Есть ли лучший способ сделать это?

Спасибо,Тея.

Ответы [ 2 ]

3 голосов
/ 08 февраля 2011

Использовать интерфейс обратного вызова, например, 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 голос
/ 08 февраля 2011

Вы можете использовать слушатель, который представляет собой простой интерфейс, который сетевой класс будет перезванивать всякий раз, когда происходит что-то интересное:

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

Это называется паттерном Наблюдение / Наблюдатель. Наблюдаемое уведомляет своих наблюдателей, когда что-то происходит, но без необходимости знать их точный тип. Класс listner разделяет две стороны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...