java—使用结构化设计模式动态选择

wljmcqd8  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(191)

我有一个服务,它从用户输入中获取一个url,提取这个url的主体内容,应用css,最后以流的形式返回结果。
棘手的部分是,我根据url有不同的实现,如果url无法识别,则使用“默认”实现。为此,我使用了一个策略模式来选择正确的运行时实现。

@Component
public class HtmlToHtmlServiceFactory {

private final List<HtmlToHtmlService> services;

@Autowired
public HtmlToHtmlServiceFactory(List<HtmlToHtmlService> services) {
    this.services = services
}

public HtmlToHtmlService getHtmlToHtmlImpl(String url) {
    return services.stream()
        .filter(service -> service.supportsUrl(url))
        .findFirst()
        .orElseThrow(() -> new IllegalArgumentException(String.format("No service found that supports [%s]", url)));
}

}

但是,由于某些原因,我必须使用结构模式。我认为装饰图案是最合适的。否则我也在考虑一种自我注册模式。
我还以为 @PostConstruct 注解对于初始化bean可能很有用,但是如何使用它Map服务呢?
编辑:
我做这个编辑,因为它似乎我没有解释好。我只有一个控制器接收包含字符串的多部分文件(这是我要解析的网站的url)

@PostMapping(value = "/website",
        consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
        produces = MediaType.TEXT_HTML_VALUE)
public ResponseEntity<InputStreamResource> parseUrl(@RequestParam String url) throws IOException {

    InputStream parsedFile = htmlToHtmlServiceFactory.getHtmlToHtmlImpl(url).htmlToHtml(url);
    InputStreamResource inputStreamResource = new InputStreamResource(parsedFile);
    return ResponseEntity.ok(inputStreamResource);
}
qgelzfjb

qgelzfjb1#

听起来你想要的是mvc模式和springmvc。您还可以查看webflux的异步。
如果你说的是微服务,你应该看看SpringCloudGateway、服务注册和发现以及断路器。
我会做如下的事情。
控制器:

@Controller
@RequestMapping("/path0")
public class HtmlToHtmlServiceFactory {

  @Autowired
  private final service1;
  @Autowired
  private final service2;

  @GetMapping("/my/path1/{var1}/more_path")
  public String getHtmlToHtmlImpl(@PathVariable("var1") VarType var1, Model model) {

    model.addAttribute("attribute1", service1.doThings(var1))

    return view/url/that/you/configured
  }

  @GetMapping("/my/path2/{var1}/more_path")
  ...

  }

控制器建议

@ControllerAdvice
public class ControllerExceptionHandler {

  @Autowired
  FallbackService fallbackService;

    @ExceptionHandler(IllegalArgumentException.class)
    public ResponseEntity<Fallback_Service_Output> validationErrorHandler(IllegalArgumentException e){
      return ResponseEntity<>(FallbackService.fallback(), HttpStatus.BAD_REQUEST);
    }
}

服务:

@Service
public class service1{

  @Autowire
  Component1 component1;

  public SomeThing doThing(VarType var){
  // do things with domain and data accesss layers and whatever else
  }

}

@Service
public class service2{...}

查看/url/that/you/configured.html:

someHTML maybe using template engine like thymeleaf or JSP

编辑:
你说的是正则表达式吗?
像这样:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Service
public class ServiceX {

    public static HtmlToHtmlService supportsUrl(String url) {
        String pattern = "^http(s)?://[-a-zA-Z0-9+&@#/%?=~_!:,.]*[-a-zA-Z0-9+&@#/%=~]";

        Pattern r = Pattern.compile(pattern);
        Matcher matcher = r.matcher(url);

        if (matcher.find()) {
            return new HtmlToHtmlServiceImplX();
        } else {
            return null;
        }
    }

    /*
    ...
     */

}

正如@tgdavies所说:

public HtmlToHtmlService getHtmlToHtmlImpl(String url) {

        return HtmlToHtmlService htmlToHtmlService = services.stream()
                    .filter(service -> service.supportsUrl(url))
                    .findFirst()
                    .orElse(new defaultHtmlToHtmlImpl());
    }

相关问题