2013-12-23 4 views
0

Я работаю над клиентом, который будет генерировать URL-адрес на входах (ключах), переданных клиенту, а затем сделать HTTP-вызов этого URL-адреса. Теперь мне нужно иметь синхронную и асинхронную реализацию этого.Класс асинхронной оболочки вокруг синхронной реализации интерфейса

Я хочу, чтобы время ожидания клиента, если оно занимает больше времени, чем указанный тайм-аут.

Так что я думал создать такой интерфейс, который будет иметь синхронные и асинхронные методы, которые будут принимать некоторые входные параметры, и я напишу класс реализации, который будет реализовывать интерфейс.

public interface Client { 

    // for synchronous 
    public String execute(final ClientInput keys); 

    // for asynchronous 
    public Future<String> executeAsync(final ClientInput keys); 
} 

Но я делал некоторые исследования, и я узнал, что лучший способ это -

Вместо двух методов один синхронный и асинхронный другой, есть один метод интерфейса, описывающий синхронное поведение. Напишите для него реализацию. А затем предоставим класс-оболочку, который обертывает реализацию вашего интерфейса, который в основном вызывает метод обернутого объекта, обеспечивая при этом асинхронное поведение.

Но почему-то я не могу понять, как это сделать? Может ли кто-нибудь представить простой пример этого, который поможет мне лучше понять, как это сделать?

+0

Это слишком широкий для здесь, а также основанный на мнениях. Тем не менее, нет необходимости в двух отдельных интерфейсах. Вы бесплатно получаете синхронный разговор о Фьючерсе; вызывая 'Future.get()' блоков, пока операция не завершится. –

+0

@BrianRoach: Я знаю, что это мнение основано, поскольку я упоминаю в своем вопросе. Я ищу асинхронный класс-оболочку вокруг sycnrhonous реализации. Если вы можете предоставить простой пример, это поможет мне лучше понять. – ferhan

ответ

1

Что вы могли бы сделать, это создать интерфейс, как это:

public interface Client { 
    public void execute (final ClientInput keys, ClientCallback callback); 

    interface ClientCallback{ 
     void onResult(String result); 
    } 
} 

И дать ему две реализации:

public class SynchronousClient implements Client{ 
    public void execute (final ClientInput keys, ClientCallback callback){ 
     String result = doStuff(); //your logic here 
     callback.onResult(result); 
    } 
} 

public class AsynchronousClient implements Client{ 
    public void execute (final ClientInput keys, ClientCallback callback){ 
     Future<String> result = doStuff(); //your logic here 
     callback.onResult(result.get()); 
    } 
} 

public class MyCallback implements ClientCallback{ 
    public void onResult(String result){ 
     //do something with the result here 
    } 
} 

EDIT: Вызов ее из кода

Для синхронных вызовов:

public void myAwesomeMethod(ClientInput keys){ 

    mySynchronousClient.execute(keys, new MyCallback{ 
     public void onResult(String result){ 
      MyMainClass.this.finishedExecuting(result); // this will be executed instantly 
     } 
    }); 
} 

Для асинхронными звонков:

public void myAwesomeMethodButNowAsync(ClientInput keys){ 
    myAsynchronousClient.execute(keys, new MyCallback{ 
     public void onResult(String result){ 
      MyMainClass.this.finishedExecuting(result);// this will be executed when your future returns 
     } 
    }); 
} 
+0

Большое спасибо Toon за предложение. В вашем примере, как я собираюсь сделать вызов синхронной и асинхронной реализации из основного класса? Почему я спрашиваю об этом, bcoz некоторые из наших клиентов будут звонить синхронному клиенту, а некоторые из них - асинхронному клиенту. Поэтому просто пытаюсь понять, как они будут звонить нам в обоих направлениях. И тогда я напишу свои собственные тесты, чтобы посмотреть, как эти два будут работать. – ferhan

+0

И еще одна вещь, на мой взгляд, в AsynchronousClient, я могу вернуть Будущему вызывающему, который вызывает мой Асинхронный клиент? – ferhan

0

ИМХО, для простоты, что вы начали еще хороший вариант. Вот почему,

  • Вы упоминали в комментариях, что некоторые из наших клиентов будут вызывать синхронную клиенту, и некоторые из них асинхронных клиента. Исходя из этого, если мы можем смело заключить (исправьте меня, если это неверное предположение), что клиенты должны знать, звонят ли они синхронно или асинхронно.
  • Создайте класс без состояния с помощью метода для вызова URL как статического метода.
  • вызвать этот метод из реализации интерфейса Client (упоминается в вашем вопросе)
  • Таким образом, клиент подвергается только один интерфейс.
Смежные вопросы