2014-03-13 186 views
0

这个类不应该是抽象的吗?如果我直接使用它,反正会给我默认对象,因此我必须继承它并覆盖我关心的方法。我使用它的方式如下:为什么HttpServletRequestWrapper类不是抽象的

public class HttpRequestWrapper extends HttpServletRequestWrapper { 
    private static final Logger logger = LoggerFactory 
      .getLogger(HttpRequestWrapper.class); 
    private final byte[] body; 
    private static Gson gson = new Gson(); 

    public HttpRequestWrapper(HttpServletRequest request) throws IOException { 
     super(request); 
     // Read the request body and save it as a byte array 
     InputStream is = super.getInputStream(); 
     body = IOUtils.toByteArray(is); 
    } 

    @Override 
    public ServletInputStream getInputStream() throws IOException { 
     return new ServletInputStreamImpl(new ByteArrayInputStream(body)); 
    } 

    @Override 
    public BufferedReader getReader() throws IOException { 
     String encBody = getCharacterEncoding(); 
     if (encBody != null && encBody != enc) { 
      enc = encBody; 
     } 
     return new BufferedReader(new InputStreamReader(getInputStream(), enc)); 
    } 
     xxxxxxxx more code xxxxxx 
} 

我不明白,直接创造的了HttpServletRequestWrapper因此为什么不是抽象对象的优势在哪里?我错过了一些关键的见解吗?包装(这是我在做什么)的包装是多余的?

更新1:有没有其他我可以用来实现相同的库?

回答

0

这个类使用的装饰设计模式,它是用来包装一个有效的HttpServletRequest的,它给你来覆盖这些接口的行为的可能性。它意味着用期望的行为来装饰类,这就是这个类不能抽象的原因。

请记住,当请求命中服务器时,容器创建一个HttpServletRequest的对象实现,此时你不能移动对象内的任何东西如执行方法,这就是为什么你使用具体的类HttpServletRequestWrapper。

该类通常与过滤器一起使用,以添加一些开箱即用的功能,而无需在servlet中移动代码,可考虑使用拦截过滤器设计模式。将原始请求封装起来并用doFilter方法将其发送到servlet

+0

实际上,此类的默认行为是回退到默认实现,并通过将其作为抽象来实现同样的行为。可以定义一个抽象类并提供所有方法的实现。抽象的好处是它不会在开发人员的心目中产生任何疑问,因为它可以直接用作包装类。 – Richeek

相关问题