装饰器模式应用:IO应用,servlet封装,ServletResponsrWrapper装饰器,装饰servletresponse
装饰器结构说明:
装饰模式的结构如下图所示。
Java中的IO是明显的装饰器模式的运用。FilterInputStream,FilterOutputStream,FilterRead,FilterWriter分别为具体装饰器的父类,相当于Decorator类,它们分别实现了InputStream,OutputStream,Reader,Writer类(这些类相当于Component,是其他组件类的父类,也是Decorator类的父类)。继承自InputStream,OutputStream,Reader,Writer这四个类的其他类是具体的组件类,每个都有相应的功能,相当于ConcreteComponent类。而继承自FilterInputStream,FilterOutputStream,FilterRead,FilterWriter这四个类的其他类就是具体的装饰器对象类,即ConcreteDecorator类。通过这些装饰器类,可以给我们提供更加具体的有用的功能。如FileInputStream是InputStream的一个子类,从文件中读取数据流,BufferedInputStream是继承自FilterInputStream的具体的装饰器类,该类提供一个内存的缓冲区类保存输入流中的数据。我们使用如下的代码来使用BufferedInputStream装饰FileInputStream,就可以提供一个内存缓冲区来保存从文件中读取的输入流。
除了IO,servlet相关操作类也运用了装饰器模式,
ServletResponsrWrapper充当Decorator,继承他的类是ConcreteDecorator,ServletResponse是Component,HttpServletResponse是ConcreteComponent,这样就把servlet封装了。
举个例子,WrapperResponse 就是ConcreteDecorator,通过它创建servletresponse对象可以提供更加完善的功能。
- public class WrapperResponse extends HttpServletResponseWrapper {
private class ResponsePrintWriter extends PrintWriter {
ByteArrayOutputStream output;
public ResponsePrintWriter(ByteArrayOutputStream output) {
super(output);
this.output = output;
}
public ByteArrayOutputStream getByteArrayOutputStream() {
return output;
}
}
private ResponsePrintWriter writer;
private ByteArrayOutputStream output;
public WrapperResponse(HttpServletResponse httpServletResponse) {
super(httpServletResponse);
output = new ByteArrayOutputStream();
writer = new ResponsePrintWriter(output);
}
public void finalize() throws Throwable {
super.finalize();
output.close();
writer.close();
}
public String getContent() {
try {
writer.flush();
return writer.getByteArrayOutputStream().toString("GBK");
}
catch(UnsupportedEncodingException e) {
return "UnsupportedEncoding";
}
}
public void close() throws IOException {
writer.close();
}
public PrintWriter getWriter() throws IOException {
return writer;
}
}
为了实现http://www.itzk.com/b/1108/581313.shtml这个功能。
在以下两种情况下可以考虑使用装饰器模式:
(1)需要在不影响其他对象的情况下,以动态、透明的方式给对象添加职责。
(2)如果不适合使用子类来进行扩展的时候,可以考虑使用装饰器模式。