装饰设计模式

装饰设计模式

前面我们讲了继承这种方式实现对目标对象方法的增强,那今天我们再讨论另外一种在开发中更常用的的方式:
装饰着设计模式。装饰设计模式有一下些在实现的时候必要的条件,就是目标对象必须实现了接口。
下面就以代码的形式演示一下装饰设计模式。
package com.itcast.store.utils;

import java.io.UnsupportedEncodingException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

/**
 * HttpServletRequestWrapper
 * 
 * 上面的httpservletRequestWrapper就是使用了装饰者设计模式,而且对HttpServletRequest方法进行了简单实现。
 * 并没有增强任何方法功能。
 * 
 * 
 * 写一个类 继承  HttpServletRequestWrapper
 * 
 * @author xps13
 *
 */
public class MyHttpServletRequest extends HttpServletRequestWrapper{

    private HttpServletRequest old;

    public MyHttpServletRequest(HttpServletRequest old) {
        super(old);
        this.old=old;
    }

    /**
     *  只需要关注增强这个方法就行了
     */
    @Override
    public String getParameter(String name) {

        //判断是否是get请求
        String method = old.getMethod();
        if("GET".equalsIgnoreCase(method)){
            //get      new String(u.getBytes("iso8859-1"),"utf-8");

            //temp  没有处理乱码的
            String temp = old.getParameter(name);

            try {
                //处理了乱码
                temp=new String(temp.getBytes("iso8859-1"),"utf-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return temp;
        }
        return old.getParameter(name);
    }
}
上面的类就是我们的代理类的代码,在使用时,应该在构造函数中传入一个request对象,通过
构造函数获得的对象,就是已经被增强过的代理对象。使用代码如下:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //处理post请求的乱码
        request.setCharacterEncoding("utf-8");
        //处理get请求的乱码,用装饰者设计模式
        MyHttpServletRequest mhsr = new MyHttpServletRequest((HttpServletRequest) request);



        chain.doFilter(mhsr, response);
    }
在过滤器中,我们执行上面的代码,那么我们在后面的servelt对象中获取到的request对象就是我们自己
处理过的代理对象,他对request中的getparameter方法进行增强,统一的处理了其中的中文乱码问题。

可能会有同学提出疑问,这个和前面说的继承解决问题是一样的。其实,这个地方我们完全可以不去继承这个类
而只是实现HttpServletRequest接口,也可以,但是,我们只是增强这一个方法,其他的方法还有去我们自己实现
要不然,我们创建的这个代理对象,就是一个垃圾的代理对象。这个就是装饰设计模式的弊端,他要让我们去手动
创建一个类,这个类要实现与目标对象相同的借口,再增强某一个方法的同时,还有实现一其他所有的无关方法
这就限制了我们在使用它的时候的场景。那么有没有方式,只让我们关注要增强的方法本身,而不用去关心那些
无关方法呢?答案是有的,那就是我们下面要说的java的动态代理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值