需要Scala设计建议

时间:2014-11-19 14:19:00

标签: scala design-patterns

我想设计一个与 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状态的任何建议吗?

1 个答案:

答案 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())
  }

}