魏靜敏
摘 要:文章首先提出了一個Web項目在國際化時需要修改HttpServletRequest的問題,針對該問題進行了調查,并通過對HttpServletRequestWrapper的擴展解決了該問題。然后針對它的應用進行了引申,最后總結了Decorator設計模式的應用場景及優(yōu)缺點。可以給初級階段Web開發(fā)人員提供了一個典型Web問題的解決方法,同時也給設計人員提供了一個裝飾器模式的設計思路。
關鍵詞:Decorator(裝飾器)模式;國際化;HttpServletRequestWrapper
1 問題描述
在項目的開發(fā)中,經(jīng)常會遇到國際化問題。例如,系統(tǒng)開發(fā)中使用的是一個客戶指定的框架,它提供了消息的讀取,畫面項目的輸入驗證等功能,但是在提示消息時框架中是固定地從HttpServletRequest中通過getLocale取得語言信息。而系統(tǒng)中的其他地方都是將畫面的下拉列表中設定的語言信息保存到session中,然后從session中取得。現(xiàn)在的問題是如何修改httpServletRequest中的getLocale方法取得的Local信息,使框架取得的Local和其他地方一致。
2 調查過程
通過調查發(fā)現(xiàn),Servlet API 中提供了一個HttpServletRequest對象的 Decorator 設計模式的默認實現(xiàn)類HttpServletRequestWrapper ,它實現(xiàn)了request接口中的所有方法,但這些方法的內部實現(xiàn)都是僅僅調用了一下所包裝的request對象的對應方法,以避免用戶在對HttpServletRequest對象進行增強時需要實現(xiàn)request接口中的所有方法。于是決定采用Decorator 設計模式對HttpServletRequest這些對象進行增強,即重寫HttpServletRequestWrapper的getLocale方法。具體解決方法如下。
3 引申
通過上面Local問題的解決,我們很容易發(fā)現(xiàn)許多的Web問題都可以通過擴展HttpServletRequestWrapper來解決。例如,使用 Decorator 模式包裝request對象,可以實現(xiàn)敏感字符過濾功能、解決中文亂碼問題。只需要重寫 getParameter 方法即可。還可以對URL進行過濾處理等。另外,還有一個和HttpServletRequestWrapper成對的類HttpServletResponseWrapper,通過重寫其中的方法可以實現(xiàn)對HttpServletResponse對象的增強。具體應用在這里就不再贅述。下面主要總結一下裝飾器模式的應用場景和優(yōu)缺點。使大家在解決問題或者設計時能夠靈活運用。
3.1 裝飾器模式應用場景
適合于默認目標實現(xiàn)中的多個接口進行排列組合調度、默認目標實現(xiàn)進行選擇性擴展、默認目標實現(xiàn)未知或者不易擴展的情況。
3.2 裝飾器模式優(yōu)點
能夠實現(xiàn)動態(tài)擴展對象功能的能力、有效避免了靈活性差、子類無限制擴張的問題、充分利用了繼承和組合的長處和短處。裝飾者和被裝飾者之間是完全獨立并可以各自獨立任意改變的。遵守大部分GRASP原則和常用設計原則,高內聚、低偶合。
3.3 裝飾器模式缺點
性能方面:過多的多態(tài)和調用,可能對性能有一定的影響。
程序復雜度方面:如果過度使用裝飾器會導致設計中出現(xiàn)許多小對象,會使程序變的較復雜。
4 結束語
文章通過具體實例解決了對HttpServletRequest對象的擴展問題, 介紹了兩個對于解決Web問題非常有用的類:HttpServletRequestWrapper,HttpServletResponseWrapper,并對其應用進行了引申,總結了裝飾器模式應用場景及優(yōu)缺點,為大家提供一個解決問題的方法和思路。
參考文獻
[1]Erich Gamma,Richard Helm,Ralph Johnson,等.設計模式:可復用面向對象軟件的基礎[M].機械工業(yè)出版社,2007.
[2]周兵.Java Web開發(fā)中的中文亂碼問題分析及解決方案[J].電腦知識與技術,2014(29).