Реализация шаблонов слушателя


В моем проекте, я делаю асинхронных процессов в почти всех классов. Чтобы объяснить мою проблему, я создал образец:

public interface TestListener {
  void onResponse(Response result);
  void onError(Exception e);
}

public class AsyncTask {
  TestListener testListener;

  public AsyncTask(TestListener testListener, Request request)
  {

  }

  public void excute()
  {
    try {
      // process request
      Response response = new Response();
      testListener.onResponse(response);
    } catch (Exception e) {
      testListener.onError(e);
    }
  }
}

public class Test1 implements TestListener {

  public void doStuff()
  {
    Request request = new Request();
    // add some stuff to request;
    AsyncTask task = new AsyncTask(this, request);
    task.excute();
  }

  @Override
  public void onResponse(Response result)
  {
    // process response

  }

  @Override
  public void onError(Exception e)
  {
    // process error

  }
}

public class Test2 implements TestListener {

  void someStuff()
  {
    Request request = new Request();
    // add some stuff to request;
    AsyncTask task = new AsyncTask(this, request);
    task.excute();
  }

  @Override
  public void onResponse(Response result)
  {
    // process response

  }

  @Override
  public void onError(Exception e)
  {
    // process error

  }
}

Это не выглядит хорошо для меня. В каждом классе у меня есть onResponse и метод onerror. Что я хочу сделать, это просто создать вспомогательный класс, который будет иметь onResponse и метод onerror и он вернет мне ответ.

public class Test1{
  public void doStuff(){
    AsyncHelper helper = AsyncHelper.getInstance();
    Response response = helper.test1Method(request);
  }
}

У меня два вопроса:

  1. Я думаю правильно снять onResponse код каждого класса и собирают в один класс.
  2. Как я должен создать AsyncHelper класса?


890
4
задан 7 декабря 2011 в 07:12 Источник Поделиться
Комментарии
2 ответа

Именование классов и дизайн (по крайней мере, насколько я вижу из кода, который вы наклеили) говорит о том, что вы хотите использовать шаблон наблюдатель. Основная идея этой модели заключается в использовании слушателей, которые реализуют общий интерфейс слушателя и зарегистрировать их на конкретных объект, который вы хотите сделать 'заметный'. Затем в наблюдаемый объект, вы можете позвонить notifyAllListeners() метод или notifyAllListenersOnError() или аналогичную которая позволит делать больше нечего, чем для слушателя от зарегистрированных слушателей звонок слушателя.оповестить() (или слушателя.метод onerror() и т. д.).

Методы оповестить(), метод onerror() и т. д. должны быть объявлены в общий интерфейс слушателя.

Что я имею в виду описанное здесь.

Основной идеей является:


  1. Создать заметный объект.

  2. Создать столько слушателей, который реализует общий интерфейс слушателя.

  3. Регистрируем все созданные слушателей на наблюдаемый объект.

  4. В наблюдаемый объект вызова notifyAll код.

enter image description here

Я также создал небольшую статью , которая объясняет эту идею.

3
ответ дан 1 ноября 2012 в 12:11 Источник Поделиться

Проверьте наблюдаемые класса и наблюдателя интерфейс на языке Java.утиль. Вы можете продлить наблюдаемых без переопределения любой из его методов для наиболее простой реализации.

Ява.утиль.Наблюдаемые

Ява.утиль.Наблюдатель

.Чистая версия эти интерфейсы немного разные, но может предоставить некоторые другие идеи, которые могут быть реализованы в Java довольно легко.

В MSDN: интерфейс IObservable(Т)

В MSDN: интерфейс iobserver(Т)

Механика как каждый работать, несколько отличаются:


  • В Java, класса, расширение наблюдаемой заявляет о себе, как изменился и называет один способ уведомить всех наблюдателей, когда он будет готов.

  • В .Чистая, класс, реализующий интерфейс IObservable поддерживает собственный список метод iobserverS, и перебирает этот список, когда будете готовы, вызывая соответствующие уведомления (об ошибке, далее или готовой). Это скорее ближе к тому, что вы хотите и могли бы быть реализованы в Java довольно легко.

1
ответ дан 1 ноября 2012 в 02:11 Источник Поделиться