如何将装饰模式应用到servlet request对象上 - 编程入门网
etMessage() { return message;
}
}
Messenger对象由一个名为MessengerFactory的工厂创建,如列表3所示。 列表3:MessengerFactory类
对每一个所创建的Messenger对象,此工厂通过某个未知的操作,初始化了getMessage()方法所返回的字符串。换句话说,你不能自己创建Messenger对象。 在程序中,Messenger对象的主要用途是被传递给一个名为Util的类中的broadcast()静态方法。列表4是Util类的代码。 列表4:Util类
在你自己的类中,你可能会有这样的代码: Messenger messenger = MessengerFactory.getMessenger(); Util.broadcast(messenger); 假设你希望对broadcast()方法所打印出的消息做一小改动。你拟将其转为大写,怎么做?表面上看,你可以继承Messenger,实例化其子类,并将返回的对象传给Util.broadcast()。但是,这种做法毫无意义,因为只有工厂才知道如何初始化Messenger对象,并通过其getMessage()方法返回正确的值。 使用装饰模式,你可以创建一个MessengerDecorator类,如列表5所示。 列表5:MessengerDecorator类
因为MessengerDecorator实现了Messenger,Util.broadcast()将接受一个MessengerDecorator的实例。然而,MessengerDecorator不仅仅是一个接口的实现,它还是一个MessengerImpl对象的装饰器。正因如此,MessengerDecorator就必须有一个接收拟被装饰的Messenger对象的构造方法。 如列表5所示,这个构造方法将参数传给变量。你现在可以覆盖MessengerDecorator中的getMessage()方法,以便将消息转为大写后再打印出来。因为你持有原来Messenger对象的引用,你可以这样写getMessage()方法:
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装饰模式的类图。 图3:Servlet API中的装饰模式 图3中的HTTP版本的类图如图4所示。别为过多的类搞晕了头,只管注意虚线框中的三个类就行了:HttpServletRequest, HttpServletRequestImpl, HttpServletRequestWrapper。 图4:Servlet API |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |