更好的理解装饰设计模式和代理设计模式
最近在一个小项目中,出现装饰模式和代理模式。有时感觉它们很像。。好好整理了下,发现还是。。。
对装饰者和被装饰者都实现同一个接口,对代理模式来说,代理类和真实处理的类,都实现同一个接口,此外,不论我们使用的是哪一个接口,都可以很容易地在真实的对象的方法前面或者后面加上自定义的方法。然而,实际上装饰器模式关注在一个对旬上动态的添加方法,然而代理模式关注于控制对象的访问。通俗的说,就是代理类可以的它的客户隐藏一个对象的具体信息,因此,我们用代理模式的时候,我们常常 一个代表类中创建一个对象的实例。并且,当我们使用装饰器模式的时候,通常我们做的是将原始对象作为一个参数传给装饰者的构造器。 下面通过这个过滤器看下装饰类是如何用的?
import java.io.IOException; import java.util.Map; import java.util.Map.Entry; 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; public class EncodingFilter implements Filter { private String encode=null; @Override public void init(FilterConfig filterConfig) throws ServletException { //拿到配置文件中的编码值 this.encode=filterConfig.getServletContext().getInitParameter("encode"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { response.setContentType("text/html;charset="+encode); chain.doFilter(new MyHttpServletRequest((HttpServletRequest) request), response); } //装饰类,用来改变不某些不想要的方法,装饰类,装饰request对象,改造和获取请求参数相关的三个方法,改造成获取有乱码的值,解决乱码后返回 // 这样一来,包装过后的request,虽然内部还是乱码,但是通过方法获取时,是解决过后没有乱码的值 class MyHttpServletRequest extends HttpServletRequestWrapper{ private HttpServletRequest request=null; private boolean EncodehasNode=true; //构造方法 public MyHttpServletRequest(HttpServletRequest request) { super(request); this.request=request; } //复写三个方法 *//** * Returns a java.util.Map of the parameters of this request. Request * parameters are extra information sent with the request. For HTTP * servlets, parameters are contained in the query string or posted form * data. * * @return an immutable java.util.Map containing parameter names as keys and * parameter values as map values. The keys in the parameter map are * of type String. The values in the parameter map are of type * String array. *//* //这三个方法是ServeltRequest接口身上的抽象方法 @Override public Map getParameterMap() { try { if(request.getMethod().equals("POST")){ //--POST提交,一行代码解决乱码,返回 request.setCharacterEncoding(encode); //return getParameterMap(); return request.getParameterMap(); }else if(request.getMethod().equals("GET")){ //--GET提交获取有乱码的Map,手动编解码解决返回 Map map=request.getParameterMap(); if(EncodehasNode){ for(Entry entry: map.entrySet() ){ String [] vs=entry.getValue(); for(int i=0;i关注打赏