Подходящий шаблон дизайна для задачи - PullRequest
0 голосов
/ 12 октября 2018

База данных содержит строки типов: 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);
}

и один бин - контекст:

public interface UnpResponseBuilderContext {
    UnpResponseBuilder getResponseBuilder(SmevMessageType smevMessageType);

    void setBuilder(SmevMessageType smevMessageType, UnpResponseBuilder bean);
}

Мой вопрос : Правильно ли этоиспользовать стратегию для этой задачи?Возможно ли что-то еще?Если стратегия соответствует правильным именам для UnpResponseBuilderContext и UnpResponseBuilder?

1 Ответ

0 голосов
/ 12 октября 2018

Давайте рассмотрим этот способ:

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

Возможно, этот подход будет лучше в вашем случае.Позвольте мне, если все в порядке.

...