0

我正在开发一个 Spring 2.0 WebService,它需要根据 WebService 请求的属性之一调用遗留服务的多种方法中的一种。我不想在我的@endpoint 中编写 if/else 检查来实现这一点。我应该使用什么样的设计模式来使其更清晰和可维护,以便当必须支持新的订单类型(请参阅下面的示例代码)时,我不需要添加另一个 else 块。

@Endpoint
public class OrderServiceEndPoint {
    @Autowired
    private OrderLegacyService orderService;

    @PayloadRoot
    public @ResponsePayload OrderResponse processRequest(
                         @RequestPayload OrderRequest request) {
        if ("Create".equals(request.type)) {
             return orderService.createOrder(request);
        } else if ("Modify".equals(request.type)) {
             return orderService.modifyOrder(request);
        } else if ("Return".equals(request.type)) {
             return orderService.returnOrder(request);
        } else if ("Replace".equals(request.type)) {
             return orderService.replaceOrder(request);
        } else {
             throw new RequestNotSupportedException();
        }

    }

我使用 org.springframework.beans.factory.config.ServiceLocatorFactoryBean 来实现工厂模式,以防我有多个相同服务的实现,例如 CreateOrderService、ModifyOrderService、ReplaceOrderService 等。但在这种情况下,我必须调用同一服务的多种方法。我目前无法更改旧服务接口,因为它已被另一个 Web 应用程序使用。

4

1 回答 1

0

如果您使用的是 Java 7(可能不是这样),Java 7 支持打开字符串。所以你可以写:

switch(request.type) {
  case "Create": return orderService.createOrder(request);
  case "Modify": return orderService.modifyOrder(request);
  case "Return": return orderService.returnOrder(request);
  case "Replace": return orderService.replaceOrder(request);
  default: throw new RequestNotSupportedException();
}

如果您使用的是 Java 6 或更早版本,请创建一个枚举类型:

public enum RequestType {
  CREATE,MODIFY,RETURN,REPLACE;
}

您可以在代码中使用以下内容:

switch (RequestType.valueOf(requestType.toUpperCase())) {
  case CREATE: return orderService.createOrder(request);
  case MODIFY: return orderService.modifyOrder(request);
  case RETURN: return orderService.returnOrder(request);
  case REPLACE: return orderService.replaceOrder(request);
  default: throw new RequestNotSupportedException();
}
于 2013-04-25T04:23:47.093 回答