2014-03-13 151 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

相關問題