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