建造者模式
建造者模式即:Director指挥builder去根据需要的材料去创建成品(product),立刻奉上几个典型应用场景,体会体会。
eg1:StringBuilder
StringBuilder builder = new StringBuilder();
builder.append("")
.insert(0,"1")
.append("");
eg2:分页查询
// 给5个属性的QueryPaginationResponse实例
QueryPaginationResponse response = new QueryPaginationResponse.Builder(1).setCount(100)
.setCurrent(1).setTotal(2).setPageSize(50).setList(new ArrayList<>()).build();
eg3:java调用es的api查询
QueryBuilder query = QueryBuilders.termQuery("_id", "-1");
SearchResponse response = client.prepareSearch("testBuilder").setQuery(query).setFrom(0).setSize(10).get();
具体的理论分析和代码演示,请参阅大神博客深入理解建造者模式 ——组装复杂的实例
应用实例具体演示:
1 对于前端请求后端返回,请求结果,或保存或修改或查询或删除或异常信息提示,统统能用,不管返回对象如何创建,需要什么就返回什么。
2 ResponseData对象构建,通过链式结构,支持多种请求下、异常情况下的后台信息反馈回前端,也是一个好用的后台结果封装工具类
public class ResponseData {
private final String message;
private final int code;
private final Map<String, Object> body = new HashMap<>();
public String getMessage() {
return message;
}
public int getCode() {
return code;
}
public Map<String, Object> getBody() {
return body;
}
public ResponseData putDataValue(String key, Object value) {
body.put(key, value);
return this;
}
private ResponseData(int code, String message) {
this.code = code;
this.message = message;
}
/**
* TODO 方法说明。
* [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
* @return
*/
public static ResponseData ok() {
return new ResponseData(200, "OK");
}
/**
* TODO 方法说明。
* [POST/PUT/PATCH]:用户新建或修改数据成功。
* @return
*/
public static ResponseData createdOrUpdate() {
return new ResponseData(201, "CREATED");
}
/**
* TODO 方法说明。
* [*]:表示一个请求已经进入后台排队(异步任务)
* @return
*/
public static ResponseData acceptedRequest() {
return new ResponseData(202, "Accepted");
}
/**
* TODO 方法说明。
* [DELETE]:用户删除数据成功。
* @return
*/
public static ResponseData deleteOk() {
return new ResponseData(204, "NO CONTENT");
}
/**
* TODO 方法说明。
* 未授权访问,表示用户没有权限(令牌、用户名、密码错误)
* @return
*/
public static ResponseData unauthorized() {
return new ResponseData(401, "未授权访问!");
}
/**
* TODO 方法说明。
* 越权访问,没有修改资源的访问权限
* @return
*/
public static ResponseData outOfBounds() {
return new ResponseData(403, "您没有改资源的访问权限!");
}
/**
* TODO 方法说明。
* 没有找到对象
* @return
*/
public static ResponseData notFound() {
return new ResponseData(404, "not found");
}
/**
* TODO 方法说明。
* 没有找到对象
* @return
*/
public static ResponseData failed() {
return new ResponseData(500, "failed");
}
/**
* TODO 方法说明。
* 方法错误
* @return
*/
public static ResponseData serverInternalError() {
return new ResponseData(500, "Server Internal Error");
}
public static void setResponse(HttpServletResponse response){
response.setContentType("application/json;charset=UTF-8");
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("access-control-allow-methods", "POST, GET,HEAD, OPTIONS,PATCH, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Authorization");
response.setHeader("access-control-allow-credentials", "true");
}
}
3 使用示例:
ResponseData.failed().putDataValue("message", "获取用户好友列表失败!");
ResponseData.ok().putDataValue("data", "userId");