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