装饰者模式在java的设计模式中属于比较重要和常见的模式,在java的IO设计就设计到很多的装饰者模式。从最简单的装饰者模式开始说起。
首先定义一个接口Base
package com.luchi.model.wrapper; public interface Base { public void doThings1(); }
在接口中定义一个方法doThings1();
再来定义一个被包装类
package com.luchi.model.wrapper; public class WrapperCLass1 implements Base{ @Override public void doThings1() { // TODO Auto-generated method stub System.out.println("I am wrapper class1"); } }
然后定义一个包装类
package com.luchi.model.wrapper; public class WrapperClass2 implements Base{ private Base baseObject; public WrapperClass2(Base baseObject){ this.baseObject=baseObject; } @Override public void doThings1() { // TODO Auto-generated method stub System.out.println("I am wrapper class 2"); baseObject.doThings1(); System.out.println("I am wrapper class 2"); } }
最后测试类
package com.luchi.model.wrapper; public class TestWrapper { public static void main(String[]args){ WrapperCLass1 wrapper1=new WrapperCLass1(); WrapperClass2 wrapper2=new WrapperClass2(wrapper1); wrapper2.doThings1(); } }
来看下测试结果:
I am wrapper class 2
I am wrapper class1
I am wrapper class 2
这是常见的设计模式,包括在动态代理中也会用到这个模式的思想,只不过动态代理设计到源代码编译会比较复杂。
在javaIO设计模式中,很容易看到这一个模式的设计身影
┌BufferedInputStream
├DataInputStream
┌FilterInputStream┼LineNumberInputStream
├FileInputStream └PushbackInputStream
├ByteArrayInputStream
┌InputStream──┼PipedInputStream
│ ├SequenceInputStream
│ ├StringBufferInputStream
│ └ObjectInputStream ┌BufferedOutputStream
│ ┌FilterOutputStream┼DataOutputStream
Object┤ ├FileOutputStream └PrintStream
├OutputStream──┼ByteArrayOutputStream
├File ├PipedOutputStream
├FileDescriptor └ObjectOutputStream
├ObjdecStreamClass
├RandomAccessFile
└StreamTokenizer
我们常见使用的BufferedInputStream buff=new BufferedInputStream(new FileInputStream(""));这句话就使用了装饰者模式,见微知著,javaIO还有很多的方面用到了这种设计模式