装饰者模式

来源:互联网 发布:淘宝自行车专卖店 编辑:程序博客网 时间:2024/05/19 16:50

保持被包装对象的原有信息,又可以对某个/某些方法进行改写。

口诀:
1、编写一个类,实现与被包装类(数据库驱动对Connection的实现)相同的接口。(使这个类和数据库的驱动实现有着相同的行为)
2、定义一个变量,引用被包装类的实例。
3、定义构造方法,传入被包装类的实例。
4、对于要改写的方法,编写自己的代码即可。
5、对于不需要改写的方法,调用原有对象的对应方法。

public class MyConnection1 implements Connection {    private Connection conn;//原来的conn,针对所有的驱动    private LinkedList<Connection> pool;//原来的池    public MyConnection1(Connection conn,LinkedList<Connection> pool) {        this.conn = conn;        this.pool = pool;    }    //还回池中    public void close() throws SQLException{        pool.addLast(conn);    }

过滤器中的使用

//实现解决全站乱码问题的过滤器public class AllCharacterEncodingFilter implements Filter {    private String encoding = "UTF-8";//设置默认编码    public void init(FilterConfig filterConfig) throws ServletException {        //获取配置文件中的信息,初始化信息encoding的值        String value = filterConfig.getInitParameter("encoding");        if(value!=null){            encoding = value;        }    }    public void doFilter(ServletRequest req, ServletResponse resp,            FilterChain chain) throws IOException, ServletException {        //必须转成HTTP协议的request类,因为放行后的servlet有可能会使用http协议的方法        HttpServletRequest request = (HttpServletRequest) req;        HttpServletResponse response = (HttpServletResponse) resp;        //解决POST请求参数中文编码问题        request.setCharacterEncoding(encoding);        //输出编码及通知客户端编码        response.setCharacterEncoding(encoding);        response.setContentType("text/html;charset="+encoding);        //写一个包装类,对request进行包装,包装类必须把被包装的对象传进来;        MyHttpServletRequest mrequest = new MyHttpServletRequest(request);        chain.doFilter(mrequest, response);    }    public void destroy() {    }}class MyHttpServletRequest extends HttpServletRequestWrapper{    private HttpServletRequest request;//引用原有对象    public MyHttpServletRequest(HttpServletRequest request) {        super(request);        this.request=request;    }    //覆盖方法    public String getParameter(String name) {        //获取name的值,后续使用        String value = request.getParameter(name);        if(value==null){            return null;        }        //只解决GET请求参数编码问题        //获取提交方式        String method = request.getMethod();        //因为浏览器提交的方法名大小写不同,所以比较的时候需要忽略大小写        if("get".equalsIgnoreCase(method)){            try {                //Tomcat的默认编码是ISO-8859-1,所以设置编码的时候需要注意                value = new String(value.getBytes("ISO-8859-1"), request.getCharacterEncoding());            } catch (UnsupportedEncodingException e) {                e.printStackTrace();            }        }        return value;    }} 设置配置文件    <filter>        <filter-name>AllCharacterEncodingFilter</filter-name>        <filter-class>com.itheima.filter.AllCharacterEncodingFilter</filter-class>        <init-param>            <param-name>encoding</param-name>            <param-value>UTF-8</param-value>        </init-param>    </filter>    <filter-mapping>        <filter-name>AllCharacterEncodingFilter</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping> 二:脏话过滤器DirtyWordsFilter(注意要有解决全站乱码的过滤器)public class DirtyWordsFilter implements Filter {    public void destroy() {    }    public void doFilter(ServletRequest arg1, ServletResponse arg2,            FilterChain chain) throws IOException, ServletException {        HttpServletRequest request = (HttpServletRequest) arg1;        HttpServletResponse response = (HttpServletResponse) arg2;        //对request进行包装,过滤        DwHttpServletRequest dwrequest = new DwHttpServletRequest(request);        chain.doFilter(dwrequest, response);    }    public void init(FilterConfig filterConfig) throws ServletException {    }}class DwHttpServletRequest extends HttpServletRequestWrapper{    private HttpServletRequest request;    public DwHttpServletRequest(HttpServletRequest request){        super(request);        this.request = request;    }    public String getParameter(String name) {        String value = request.getParameter(name);        if(value==null){            return null;        }//定义脏话字典        String[] dws = new String[]{"畜生","禽兽","SB"};        for(String s:dws){            //判断value里面是否包含脏话字典里的词            if(value.contains(s)){                //                value = value.replace(s, "**");            }        }        return value;    }} 
0 0
原创粉丝点击