装饰器模式在Web方面的应用解析
2016-05-14魏静敏
魏静敏
摘 要:文章首先提出了一个Web项目在国际化时需要修改HttpServletRequest的问题,针对该问题进行了调查,并通过对HttpServletRequestWrapper的扩展解决了该问题。然后针对它的应用进行了引申,最后总结了Decorator设计模式的应用场景及优缺点。可以给初级阶段Web开发人员提供了一个典型Web问题的解决方法,同时也给设计人员提供了一个装饰器模式的设计思路。
关键词:Decorator(装饰器)模式;国际化;HttpServletRequestWrapper
1 问题描述
在项目的开发中,经常会遇到国际化问题。例如,系统开发中使用的是一个客户指定的框架,它提供了消息的读取,画面项目的输入验证等功能,但是在提示消息时框架中是固定地从HttpServletRequest中通过getLocale取得语言信息。而系统中的其他地方都是将画面的下拉列表中设定的语言信息保存到session中,然后从session中取得。现在的问题是如何修改httpServletRequest中的getLocale方法取得的Local信息,使框架取得的Local和其他地方一致。
2 调查过程
通过调查发现,Servlet API 中提供了一个HttpServletRequest对象的 Decorator 设计模式的默认实现类HttpServletRequestWrapper ,它实现了request接口中的所有方法,但这些方法的内部实现都是仅仅调用了一下所包装的request对象的对应方法,以避免用户在对HttpServletRequest对象进行增强时需要实现request接口中的所有方法。于是决定采用Decorator 设计模式对HttpServletRequest这些对象进行增强,即重写HttpServletRequestWrapper的getLocale方法。具体解决方法如下。
3 引申
通过上面Local问题的解决,我们很容易发现许多的Web问题都可以通过扩展HttpServletRequestWrapper来解决。例如,使用 Decorator 模式包装request对象,可以实现敏感字符过滤功能、解决中文乱码问题。只需要重写 getParameter 方法即可。还可以对URL进行过滤处理等。另外,还有一个和HttpServletRequestWrapper成对的类HttpServletResponseWrapper,通过重写其中的方法可以实现对HttpServletResponse对象的增强。具体应用在这里就不再赘述。下面主要总结一下装饰器模式的应用场景和优缺点。使大家在解决问题或者设计时能够灵活运用。
3.1 装饰器模式应用场景
适合于默认目标实现中的多个接口进行排列组合调度、默认目标实现进行选择性扩展、默认目标实现未知或者不易扩展的情况。
3.2 装饰器模式优点
能够实现动态扩展对象功能的能力、有效避免了灵活性差、子类无限制扩张的问题、充分利用了继承和组合的长处和短处。装饰者和被装饰者之间是完全独立并可以各自独立任意改变的。遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。
3.3 装饰器模式缺点
性能方面:过多的多态和调用,可能对性能有一定的影响。
程序复杂度方面:如果过度使用装饰器会导致设计中出现许多小对象,会使程序变的较复杂。
4 结束语
文章通过具体实例解决了对HttpServletRequest对象的扩展问题, 介绍了两个对于解决Web问题非常有用的类:HttpServletRequestWrapper,HttpServletResponseWrapper,并对其应用进行了引申,总结了装饰器模式应用场景及优缺点,为大家提供一个解决问题的方法和思路。
参考文献
[1]Erich Gamma,Richard Helm,Ralph Johnson,等.设计模式:可复用面向对象软件的基础[M].机械工业出版社,2007.
[2]周兵.Java Web开发中的中文乱码问题分析及解决方案[J].电脑知识与技术,2014(29).