一、什么是Decorator模式
Decorator模式和Wrapper模式都允许装饰和包装某一个对象的行为,说白了,就是对某个对象进行修改
唯一必须满足的条件:被修饰对象的类要实现一个接口,并且要包装的方法必须从这个接口中继承
在修饰类中,被装饰的方法是指其行为要在子类中进行修改的方法。无论是否装饰,所有方法都要在Component中调用
修饰类它为其中的每一个方法都提供默认的实现,行为的具体改变由子类实现
必须记住:装饰类与被装饰的对象必须实现同一个接口
以下为装饰类的实现:
(通过接口来传入构造函数,实现与被装饰的对象的对接)
public class Decorator implements Component{
private Component decorator;
public Decorator (Component component){
this.decorator=component;
}
@Override
public void methodA(args){
decorator.methodA(args);
}
@Override
public void methodB(args){
decorator.methodB(args);
}
}
二、Servlet Wrapper类
Servlet API中有四个包装(修饰类)类,分别是:
ServletRequestWrapper ,ServletResponseWrapper,HttpServletRequestWrapper,HttpServletResponseWrapper
他们分别通过实现httpServletRequest等接口,实现对装饰对象请求或者响应的装饰
我们可以通过继承他们,覆盖需要修改的方法即可
三、实例:AutoCorrect过滤器
在web程序中,用户经常会在输入值的时候,在其前面或者后面加入空格,甚至在词与词之间会加入一些多余的空格
该AutoCorrect过滤器可以自动去掉前后的空格,并将词与词之间的空格控制在一位,删除掉多余的空格
AutoCorrectFilter类
import java.io.IOException;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
@WebFilter(urlPatterns={"/*"},filterName="AutoCorrectFilter")
public class AutoCorrectFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest httpServletRequest=(HttpServletRequest) arg0;
AutoCorrectHttpServletRequest wrapper=new
AutoCorrectHttpServletRequest(httpServletRequest);
arg2.doFilter(wrapper, arg1);
}
class AutoCorrectHttpServletRequest extends HttpServletRequestWrapper{
private HttpServletRequest httpServletRequest;
public AutoCorrectHttpServletRequest(HttpServletRequest request) {
super(request);
this.httpServletRequest=request;
}
@Override
public String getParameter(String name) {
// TODO Auto-generated method stub
return autoCorrect(httpServletRequest.getParameter(name));
}
@Override
public String[] getParameterValues(String name) {
// TODO Auto-generated method stub
return autoCorrect(httpServletRequest.getParameterValues(name));
}
@Override
public Map<String, String[]> getParameterMap() {
// TODO Auto-generated method stub
final Map<String, String[]> parameterMap=httpServletRequest.getParameterMap();
Map<String, String[]> newMap=new Map<String, String[]>(){
@Override
public int size() {
// TODO Auto-generated method stub
return parameterMap.size();
}
@Override
public boolean isEmpty() {
// TODO Auto-generated method stub
return parameterMap.isEmpty();
}
@Override
public boolean containsKey(Object key) {
// TODO Auto-generated method stub
return parameterMap.containsKey(key);
}
@Override
public boolean containsValue(Object value) {
// TODO Auto-generated method stub
return parameterMap.containsValue(value);
}
@Override
public String[] get(Object key) {
// TODO Auto-generated method stub
return autoCorrect(parameterMap.get(key));
}
@Override
public String[] put(String key, String[] value) {
// TODO Auto-generated method stub
return parameterMap.put(key, value);
}
@Override
public String[] remove(Object key) {
// TODO Auto-generated method stub
return parameterMap.remove(key);
}
@Override
public void putAll(Map<? extends String, ? extends String[]> m) {
// TODO Auto-generated method stub
parameterMap.putAll(m);
}
@Override
public void clear() {
// TODO Auto-generated method stub
parameterMap.clear();
}
@Override
public Set<String> keySet() {
// TODO Auto-generated method stub
return parameterMap.keySet();
}
@Override
public Collection<String[]> values() {
// TODO Auto-generated method stub
return null;
}
@Override
public Set<java.util.Map.Entry<String, String[]>> entrySet() {
// TODO Auto-generated method stub
return null;
}
};
return super.getParameterMap();
}
private String autoCorrect(String value) {
// TODO Auto-generated method stub
if(value==null){
return null;
}
value=value.trim();
int length=value.length();
StringBuilder temp=new StringBuilder();
boolean lastCharWasSpace=false;
for(int i=0;i<length;i++){
char c=value.charAt(i);
if(c==' '){
if(!lastCharWasSpace){
temp.append(c);
}
lastCharWasSpace=true;
}else{
temp.append(c);
lastCharWasSpace=false;
}
}
return temp.toString();
}
private String[] autoCorrect(String[] strings) {
// TODO Auto-generated method stub
return null;
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
AutoCorrectHttpServletRequest通过继承HttpServletRequestWrapper实现了HttpServletRequest接口
在AutoCorrectHttpServletRequest类中修改HttpServletRequest接口的方法并将修饰过的对象传给doFilter方法
test1.jsp页面
<body> <form action="test2.jsp" method="post"> <table> <tr> <td>Name:</td> <td><input name="name" ></td></tr> <tr> <td>Address:</td> <td><input name="address"></td></tr> <tr> <td colspan="2"> <input type="submit" value="login"></td></tr></table></form> </body>
test2.jsp页面
<body> <table><tr><td>Name:</td> <td>${param.name}</td></tr> <tr><td>Address:</td> <td>${param.address}</td></tr></table> <br> </body>
实现结果