这样的 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);
- }
- //其他实现代码略。。。
- }
(编辑:ASP站长网)
|