我想设计一个与 REST API 对话的客户端。我实现了实际上在服务器上调用 HTTP 方法的位。我将此层称为API层。服务器公开的每个操作都封装为此层中的一个方法。此方法将ClientContext
作为输入,其中包含在服务器上进行HTTP方法调用所需的所有信息。
我现在正在尝试设置此图层的界面,我们称之为ClientLayer
。此接口将是我的客户端库的任何用户应该用来使用服务的接口。在调用接口时,用户应创建ClientContext
,根据他愿意调用的操作设置请求参数。使用传统的 Java 方法,我的ClientLayer
对象上有一个状态代表ClientContext
:
例如:
public class ClientLayer {
private static final ClientContext;
...
}
然后我会有一些构建器来设置我的ClientContext
。示例调用如下所示:
ClientLayer client = ClientLayer.getDefaultClient();
client.executeMyMethod(client.getClientContext, new MyMethodParameters(...))
来到 Scala ,有关如何在ClientContext
实例化方面具有相同级别的简单性同时避免将其作为ClientLayer
状态的任何建议吗?
答案 0 :(得分:1)
我会在这里使用工厂模式:
object RestClient {
class ClientContext
class MyMethodParameters
trait Client {
def operation1(params: MyMethodParameters)
}
class MyClient(val context: ClientContext) extends Client {
def operation1(params: MyMethodParameters) = {
// do something here based on the context
}
}
object ClientFactory {
val defaultContext: ClientContext = // set it up here;
def build(context: ClientContext): Client = {
// builder logic here
// object caching can be used to avoid instantiation of duplicate objects
context match {
case _ => new MyClient(context)
}
}
def getDefaultClient = build(defaultContext)
}
def main(args: Array[String]) {
val client = ClientFactory.getDefaultClient
client.operation1(new MyMethodParameters())
}
}