装饰者设计模式:
开发者在使用某个类的方法时,觉得这个类的方法不满足需求,希望在原有的基础上增强它,这时可以使用装饰者模式进行增强
设计步骤:
1、编写一个装饰类,继承被装饰类,要求被装饰类不能为final,因为final类不能被继承
2、声明一个(被装饰类类型)的成员变量
3、在装饰类的构造方法中,接收被装饰类对象
4、重写需要增强的方法
装饰者设计模式和代理设计模式的区别:
装饰者模式和代理模式,从设计上来说确实有点类似,但也有它们各自的区别
装饰者模式可以设计的跟代理模式一样,即代理模式中包含装饰者模式,但是反过来装饰者模式中不包含代理模式
代理模式:是为了得到被代理类的方法调用权,可以改造被代理类的内容
装饰者模式:是为了增强原有的被装饰类的方法内容
package c_example_filter;
import java.io.IOException;
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.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
/**
* 过滤器首先要实现javax.servlet的Filter接口,并且实现其中的方法
* @author Mao
*
*/
public class demo1 implements Filter{
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
request.setCharacterEncoding("utf-8");
//过滤的开始拦截
System.out.println("请求的拦截 ");
//使用装饰者的类进行加强,可以进行方法加强的过滤
MyServlet myrequest = new MyServlet(request);
//放行,执行过滤完了以后的后面的逻辑,或者是执行过滤链中的其他过滤
chain.doFilter(myrequest,resp);
//过滤后的执行
System.out.println("响应的拦截");
}
}
/**
* 当要对一个类中的方法进行改造和加强,可以使用装饰者模式
*/
class MyServlet extends HttpServletRequestWrapper{
//1)要设置一个成员变量用来进行设置
private HttpServletRequest request;
public MyServlet(HttpServletRequest request) {
super(request);
//2)在有参的构造方法中进行对成员变量的设置
this.request = request;
}
//3)重写要进行加强的方法
@Override
public String getParameter(String name) {
try {
//1)得到原来的实际参数内容
String value = request.getParameter(name);//iso-8859-1
//2)增强
if(value!=null && "GET".equals(request.getMethod())){
value = new String(value.getBytes("iso-8859-1"),"utf-8");
}
//3)返回增强后内容
return value;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Override
public String[] getParameterValues(String name) {
try {
String[] values = request.getParameterValues(name);
if(values!=null && "GET".equals(request.getMethod())){
for(int i=0;i<values.length;i++){
values[i] = new String(values[i].getBytes("iso-8859-1"),"utf-8");
}
}
return values;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
装饰者模式的运用是为了重写某类的方法让其方法加强更多的功能的实现