首页 > 学院 > 开发设计 > 正文

装饰设计模式

2019-11-06 06:59:26
字体:
来源:转载
供稿:网友

装饰设计模式,是在不改变原类的情况下,动态修改或者扩展原类的功能. 步骤: 1.编写一个类并实现与原类相同的接口(或者继承该接口的包装类,目的是能够实现原类的方法) 2.在类中声明一个原类的引用.(目的为了能够在包装类中调用原类的功能) 3.定义构造方方法,一般构造方法的参数为被包装类对象,将赋值给步骤2中声明的引用 4.实现方法: 对于不需要修改的方法,使用声明的那个引用调用原类方法 对于需要修改的方法,写自己的代码.

使用filter过滤全局编码时可以用到装饰设计模式,对传过来的request进行包装,在包装类中对request进行编码过滤.

具体代码如下: import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Map;

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;import javax.servlet.http.HttpServletResponse;public class MyFilter implements Filter{ public void destroy() { // TODO Auto-generated method stub } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub HttpServletRequest hsr = (HttpServletRequest) request; //传入原类方法对象 MyRequest req = new MyRequest(hsr); chain.doFilter(req, response); } //由于httpServletRequest方法太多,所以使用它的适配器类进行代替.class MyRequest extends HttpServletRequestWrapper{//声明原类引用 HttpServletRequest request; public MyRequest(HttpServletRequest request){ super(request); this.request= request; } PRivate boolean flag =true; @Override //覆盖父类方法,实现编码过滤 public Map<String,String[]> getParameterMap() { // TODO Auto-generated method stub Map<String,String[]> map = request.getParameterMap(); if(flag){ for (Map.Entry<String, String[]> m : map.entrySet()) { String[] values = m.getValue(); for (int i = 0; i < values.length; i++) { try { values[i] = new String( values[i].getBytes("iso-8859-1"), "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } flag =false; } return map; } @Override public String getParameter(String name) { // TODO Auto-generated method stub Map<String, String[]> map = getParameterMap(); return map.get(name)[0]; } @Override public String[] getParameterValues(String name) { // TODO Auto-generated method stub if(name!=null){ String[] str = (String[]) getParameterMap().get(name); if(str!=null){ return str; } } return null; }} public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub }}
上一篇:17.03.05 Scanner

下一篇:C#代码注释

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表