| 这样的 builder 代码,让我是在恶心难受,于是我打算用 lombok 重构这段代码: @Builder public class Student {  private String name;  private int age; } 
 调用方式: Student student = Student.builder().name("zs").age(24).build(); 
 代理模式 正如我们所知的,在程序中调用 rest 接口是一个常见的行为动作,如果你和我一样使用过 spring 的  RestTemplate,我相信你会我和一样,对他抛出的非 http 状态码异常深恶痛绝。 所以我们考虑将 RestTemplate 最为底层包装器进行包装器模式的设计: public abstract class FilterRestTemplate implements RestOperations {  protected volatile RestTemplate restTemplate;  protected FilterRestTemplate(RestTemplate restTemplate){  this.restTemplate = restTemplate;  }  //实现RestOperations所有的接口 } 
 然后再由扩展类对 FilterRestTemplate 进行包装扩展: public class ExtractRestTemplate extends FilterRestTemplate {  private RestTemplate restTemplate;  public ExtractRestTemplate(RestTemplate restTemplate) {  super(restTemplate);  this.restTemplate = restTemplate;  }  public <T> RestResponseDTO<T> postForEntityWithNoException(String url, Object request, Class<T> responseType, Object... uriVariables)  throws RestClientException {  RestResponseDTO<T> restResponseDTO = new RestResponseDTO<T>();  ResponseEntity<T> tResponseEntity;  try {  tResponseEntity = restTemplate.postForEntity(url, request, responseType, uriVariables);  restResponseDTO.setData(tResponseEntity.getBody());  restResponseDTO.setMessage(tResponseEntity.getStatusCode().name());  restResponseDTO.setStatusCode(tResponseEntity.getStatusCodeValue());  }catch (Exception e){  restResponseDTO.setStatusCode(RestResponseDTO.UNKNOWN_ERROR);  restResponseDTO.setMessage(e.getMessage());  restResponseDTO.setData(null);  }  return restResponseDTO;  } } 
 包装器 ExtractRestTemplate 很完美的更改了异常抛出的行为,让程序更具有容错性。在这里我们不考虑 ExtractRestTemplate  完成的功能,让我们把焦点放在 FilterRestTemplate 上,“实现 RestOperations  所有的接口”,这个操作绝对不是一时半会可以写完的,当时在重构之前我几乎写了半个小时,如下: public abstract class FilterRestTemplate implements RestOperations {  protected volatile RestTemplate restTemplate;  protected FilterRestTemplate(RestTemplate restTemplate) {  this.restTemplate = restTemplate;  }  @Override  public <T> T getForObject(String url, Class<T> responseType, Object... uriVariables) throws RestClientException {  return restTemplate.getForObject(url,responseType,uriVariables);  }  @Override  public <T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException {  return restTemplate.getForObject(url,responseType,uriVariables);  }  @Override  public <T> T getForObject(URI url, Class<T> responseType) throws RestClientException {  return restTemplate.getForObject(url,responseType);  }  @Override  public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables) throws RestClientException {  return restTemplate.getForEntity(url,responseType,uriVariables);  }  //其他实现代码略。。。 } 
 (编辑:鹰潭站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |