【问题标题】:Suitable design pattern for the task适合任务的设计模式
【发布时间】:2018-10-12 08:02:51
【问题描述】:

数据库包含类型的行:TYPE1, TYPE2, TYP3, TYPEN

当用户向我的服务发送请求并等待我接下来做出的响应时:

1) 拨打responseService回复:

@Override
public GetResponseResponse getResponse(GetResponseRequest request) 
       return responseService.getResponse(request);
}

2) 在responseService 准备回复:

@Override
@Transactional
public GetResponseResponse getResponse(GetResponseRequest request) {

    //get data from DB
    SmevMessage smevMessage = smevMessageService.findOneFinished(request.getP1(), request.getP2());

    //validate

    //create general response for all TYPES of response
     GetResponseResponse getResponseResponse = new GetResponseResponse();

    //get Builder for concrete resonse part
    UnpResponseBuilder unpResponseBuilder = unpResponseBuilderContext.getResponseBuilder(smevMessage.getRequestType());
    Element element = unpResponseBuilder.createResponse(smevMessage);

    //set part to general response
    getResponseResponse.setAny(element);

    return getResponseResponse;
}

我生成一般响应,但每个响应都有针对每种类型的特定部分。我为此使用策略设计模式。

我有这个接口的一些实现:

public interface UnpResponseBuilder {
    Element createResponse(SmevMessage smevMessage);
}

还有一个 bean - 上下文:

public interface UnpResponseBuilderContext {
    UnpResponseBuilder getResponseBuilder(SmevMessageType smevMessageType);

    void setBuilder(SmevMessageType smevMessageType, UnpResponseBuilder bean);
}

我的问题:对这项任务使用策略是否正确?还有其他可能吗?如果该策略适合 UnpResponseBuilderContextUnpResponseBuilder 的正确名称?

【问题讨论】:

    标签: java spring design-patterns strategy-pattern


    【解决方案1】:

    让我们这样考虑:

    public CreateResponseStrategy {
      public Element createResponse(SmevMessage smevMessage);
    }
    
    public FirstCreateResponseStrategy implements CreateResponseStrategy {
      public Element createResponse(SmevMessage smevMessage) {
      //logic
      }
    }
    
    public SecondCreateResponseStrategy implements CreateResponseStrategy {
      public Element createResponse(SmevMessage smevMessage) {
      //logic
      }
    }
    

    稍后在您的 responseService 类中:

    final ImmutableMap<String,CreateResponseStrategy> strategyMap = ImmutableMap.<String, CreateResponseStrategy>builder()
                .put("firstType", new FirstCreateResponseStrategy())
                .put("secondType",new SecondCreateResponseStrategy() )
                .build()
    
    public GetResponseResponse getResponse(GetResponseRequest request) {
    
        //get data from DB
        SmevMessage smevMessage = smevMessageService.findOneFinished(request.getP1(), request.getP2());
    
        GetResponseResponse getResponseResponse = new GetResponseResponse();
    
        Element element = strategyMap.get(smevMessage.getRequestType()).createResponse(smevMessage); //additionaly check if element exists in map
    
        getResponseResponse.setAny(element);
    
        return getResponseResponse;
    }
    

    也许这种方法在您的情况下会更好。没事就给我吧。

    【讨论】:

      猜你喜欢
      • 2016-03-29
      • 2020-02-20
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多