你可能已经在使用Decorator模式了,但是和所有的模式都一样,有一点是很重要的,那就是要了解你为什么在使用它,以及如何同其他开发人员就它进行交流。
使用Decorator模式——也叫做Wrapper模式——的主要原因是需要把功能添加给类,而不需要修改其代码或者扰乱其继承。尽管你可能会希望类拥有更多的功能,使用Decorator模式就意味着:已经被你改善过的功能不再需要通过扩展类来再次使用已有的功能。
这里有个例子。如果给定了一个叫做Action的接口,它带有两个方法,act1()和act2(),而且这个接口的具体版本ConcreteAction也已给定,那么Decorator将是一个实现Action的类,而且其构造函数会接纳Action(常常是ConcreteAction)。所以其代码看起来会像Listing A里的那样。
使用Decorator所产生的类比继承的更少,所以代码的编写会更加简单;但是,它常常产生更多的对象,这让调试更加困难,尤其因为加入的灵活性会在新的方面产生错误。
JavaServer页面标准标签库(JSTL)提供了自定义标签的标准集,其中包括JSTL导入标签。这个导入标签向jsp:include标签添加功能,并消除了你自己为这些功能编写代码的需要。
第一个额外的功能能让你能够直接地把其他Web网站的内容包括进自己的页面。所以下面的内容现在是合法的:
<c:import url="http://www.example.com/somecontent.html"/>
你甚至可以使用ftp:
<c:import url="ftp://ftp.example.com/somecontent.txt"/>
你可以把URL保存到变量里,而不是直接地把它导入到页面。这是所有JSTL标签所通用的策略,并能增加JSP页面的能力:
<c:import url="http://www.example.com/example.inc" var="example"/>
由于这个被包括的页面是被保存在example变量里的,所以你可以使用另一个taglib,例如Jakarta字符串的taglib,来使用done.com替换掉所有对example.com的参照。JSTL导入标签有一个c的命名空间,这个c代表core,是推荐的命名空间。