2013-12-23 51 views
0

我正在处理客户端,它将在传递给客户端的输入(键)上生成URL基础,然后对该URL进行HTTP调用。现在我需要同步和异步实现这一点。异步包装类围绕接口的同步实现

我想超时的客户端,如果它的时间超过指定的时间。

所以我想制作一个这样的接口,它将有同步和异步方法,它们将接受一些输入参数,我将编写一个实现接口的实现类。

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

编辑:从你的代码中调用它

对于同步呼叫:

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的建议。在你的例子中,我将如何调用主类的同步和异步实现?为什么我问这是,我们的一些客户会调用同步客户端,其中一些客户端是异步客户端。所以试图了解他们将如何在两种方式中给我们打电话。然后我会写我自己的测试,看看这两个是如何解决的。 – ferhan

+0

我还有一件事想到,在AsynchronousClient中,我可能会返回Future给调用我的Asnchronous客户端的调用者? – ferhan

0

恕我直言,为了简单起见,你开始什么仍然是一个不错的选择。这是为什么,

  • 您在评论中提到,我们的一些客户会调用同步客户端,其中一些异步客户端。基于此,如果我们可以安全地推断(正确的我,如果这是不正确的假设)客户端需要知道他们是否调用同步或异步。
  • 使用方法调用URL作为静态方法创建一个无状态类。
  • 从实现这种方式的客户端暴露一个接口(在你的问题中提到)接口Client
  • 的调用此方法。