背景: 临近放假,手上的活没那么多了, 积累了一些设计模式经验 分享给大家
今天说的 是 装饰者模式
装饰器模式
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
直接干货 示例demo如下:
package com.yzgu.up.disignpattern.decorator;
import org.apache.commons.lang3.StringUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.NoSuchElementException;
/**
* request 增强类,项目中可以用来校验和设置token
*
* 具体使用可以基于过滤器拦截,配置 在mvc配置中就行
* @author yzgu
*/
public class StrongRequestDemo extends HttpServletRequestWrapper {
private final Map<String, String> customHeaders;
private HttpServletRequest req;
public StrongRequestDemo(HttpServletRequest request) {
super(request);
this.req = request;
this.customHeaders = new HashMap<String, String>();
}
public void putHeader(String name, String value) {
this.customHeaders.put(name, value);
}
@Override
public String getHeader(String name) {
if (name == "SID") {
if (StringUtils.isBlank(req.getHeader(name))) {
// return "QWRER";
throw new RuntimeException("未携带SID信息");
}
}
return req.getHeader(name);
}
public Map<String, String> getCustomHeaders() {
return customHeaders;
}
@Override
public Enumeration<String> getHeaders(String name) {
if (null != name && name.equals("SID")) {
return new Enumeration<String>() {
private boolean hasGetted = false;
@Override
public boolean hasMoreElements() {
return !hasGetted;
}
@Override
public String nextElement() {
if (hasGetted) {
throw new NoSuchElementException();
} else {
hasGetted = true;
return name;
}
}
};
}
return super.getHeaders(name);
}
}
上面 例子 是基于 request的装饰类做了一定的拓展增强,具体功能的话,可以实现 对token 鉴权,也可以作为中转服务设置request 头 header信息(这个本来是客户调用端做的事),当然这些动作你也可以基于拦截器 实现此功能。
示例demo2:
package com.yzgu.up.disignpattern.decorator;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.UnsupportedEncodingException;
/**
* 装饰者模式对HttpServletRequest进行增强。
* 两种方法:
* 1: implements HttpServletRequest(所有的方法都要自己来重写,所以,建议使用第二种方法,也就是通过继承HttpServletRequestWrapper,再对自己的需要进行重写相应的方法)
* 2: extends HttpServletRequestWrapper(已经用装饰者模式帮我们重写所有的方法,我们只需要重写自己需要重写的方法就可以了,而免去了对其它方法的进行重写的麻烦)
* @author yzgu
*/
public class EncodingRequest extends HttpServletRequestWrapper {
private HttpServletRequest req;
public EncodingRequest(HttpServletRequest request) {
super(request);
this.req = request;
}
/**
* 增强getParameter()方法,使其能够自行处理get的编码问题
*/
@Override
public String getParameter(String name) {
String value = req.getParameter(name);
try {
//处理get方式
value = new String(value.getBytes("ISO-8859-1"),"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return value;
}
}
示例2 主要是针对 request 编码做了装饰, 可以统一处理编码。 你也不要倔,实现统一编码 方式有很多,不会直接私信我。
好了 , 简单示例,你学废了的话, 点个赞啥的 支持下楼主。