快速业务通道

如何将装饰模式应用到servlet request对象上 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18
etMessage() {  return message; } }

Messenger对象由一个名为MessengerFactory的工厂创建,如列表3所示。

列表3:MessengerFactory类

public class MessengerFactory { public static Messenger getMessenger() { return new MessengerImpl("secrets"); } }

对每一个所创建的Messenger对象,此工厂通过某个未知的操作,初始化了getMessage()方法所返回的字符串。换句话说,你不能自己创建Messenger对象。

在程序中,Messenger对象的主要用途是被传递给一个名为Util的类中的broadcast()静态方法。列表4是Util类的代码。

列表4:Util类

public class Util { public static void broadcast(Messenger messenger) { System.out.print(messenger.getMessage()); } // other methods here}

在你自己的类中,你可能会有这样的代码:

Messenger messenger = MessengerFactory.getMessenger();

Util.broadcast(messenger);

假设你希望对broadcast()方法所打印出的消息做一小改动。你拟将其转为大写,怎么做?表面上看,你可以继承Messenger,实例化其子类,并将返回的对象传给Util.broadcast()。但是,这种做法毫无意义,因为只有工厂才知道如何初始化Messenger对象,并通过其getMessage()方法返回正确的值。

使用装饰模式,你可以创建一个MessengerDecorator类,如列表5所示。

列表5:MessengerDecorator类

public class MessengerDecorator implements Messenger { private Messenger messenger; public MessengerDecorator(Messenger messenger) {  this.messenger = messenger; } public String getMessage() {  return messenger.getMessage().toUpperCase(); } }

因为MessengerDecorator实现了Messenger,Util.broadcast()将接受一个MessengerDecorator的实例。然而,MessengerDecorator不仅仅是一个接口的实现,它还是一个MessengerImpl对象的装饰器。正因如此,MessengerDecorator就必须有一个接收拟被装饰的Messenger对象的构造方法。

如列表5所示,这个构造方法将参数传给变量。你现在可以覆盖MessengerDecorator中的getMessage()方法,以便将消息转为大写后再打印出来。因为你持有原来Messenger对象的引用,你可以这样写getMessage()方法:

public String getMessage() { return this.messenger.getMessage().toUpperCase(); }

MessengerDecorator中的getMessage()方法返回原始消息的大写版本。

在你的类中,就像往常一样,你得到一个Messenger对象,并将Decorator传给Util.broadcast()。

Messenger messenger = factory.getMessenger();

Util.broadcast(new MessengerDecorator(messenger));

你并不将原始对象传给原先的目标,相反,你将其传给了该对象的装饰器。

如何将装饰模式应用到servlet request对象上(3)

时间:2011-03-23

应用装饰模式于Servlet

以上Messenger类的例子与servlet容器所构造的ServletRequest对象是一样的。当收到一个HTTP请求时,servlet容器就会创建ServletRequest对象及ServletResponse对象(分别是ServletRequestImpl及ServletResponseImpl的实例),并将这两个对象传递给特定的servlet服务方法。现在,如果你为ServletRequest创建一个装饰角色,并将其传给servlet服务方法,你就应用了装饰模式。

对ServletRequest很容易应用装饰模式,因为servlet API已经为其提供了一个包装类:ServletRequestWrapper。图3是一个servlet装饰模式的类图。

如何将装饰模式应用到servlet request对象上 - 编程入门网

图3:Servlet API中的装饰模式

图3中的HTTP版本的类图如图4所示。别为过多的类搞晕了头,只管注意虚线框中的三个类就行了:HttpServletRequest, HttpServletRequestImpl, HttpServletRequestWrapper。

如何将装饰模式应用到servlet request对象上 - 编程入门网

图4:Servlet API

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号