Java实际应用中经常遇到的"装饰模式"总结

java实际应用中,经常会遇到BufferedWriter FilterWriter = new BufferedWriter(newFileWriter("Filter.txt")); 类似的语句,尤其是在I/O操作类中,这种用新new的类包裹着旧new的类对象的形式很常见。这里用到的就是所谓的装饰模式。

理论上来说,一个类A的方法能力上包含或者使用了另一个类B的方法能力,这种情况一般只有两只种途径,一是继承,二是组合。

继承很好理解,class A extend B,A中就继承了B的所有能力方法,并且能使用它们。

组合也容易理解,class A { B b;},那么A中就包含了B的对象b,调用b的方法可以被A利用。

这时,突然增加另一种模式,号称通过该模式也能实现用A类来使用B类的方法和能力,前提只有一个就是A类和B类有共同的父类,这就是所谓的装饰模式,举个最简单的装饰模式的例子:

public interface OBJ

{


public void fun1();


}


public class decorate implements OBJ

{       


OBJ obj;


public decorate (OBJ obj){


this.obj= obj;


}


@Override

public void fun1() {

// TODO Auto-generated method stub

obj.fun1();

}

};


public class MyDecorate extends decorate

{


public MyDecorate(OBJ obj)

{

super(obj);

}


public void fun1(){


super.fun1();


System.out.println("MyDecorate. fun1()");


}


}



public class MyObj implements OBJ


{


public void fun1(){


System.out.println("MyObj. fun1()");


}


}


public class DecorateTest {

public static void main(String[] args) {

MyDecorate myDecorate=new MyDecorate(new MyObj());

myDecorate. fun1();

}

}


当在程序中执行下面语句时

MyDecorate myDecorate=new MyDecorate(new MyObj());

myDecorate. fun1();

执行结果:

MyObj. fun1()

MyDecorate. fun1()

也就是MyDecorate的对象执行了MyObjfun1()能力,在执行完该能力后再执行自己的能力,但是跟前面的继承和组合不同,MyDecorate既不是继承了MyObj,也非成员包含了MyObj 的对象,但是却能调用MyObj的能力。这就是所谓的装饰模式,MyDecorate是装饰者,MyObj是被装饰者。整个调用过程如下:

1.MyDecorate myDecorate=new MyDecorate(new MyObj());的执行过程中调用MyDecorate的构造方法,构造方法中调用了Super(obj);也就是父类decorate的构造方法,并赋值给decorate类的对象成员This. Obj= obj;

2.执行myDecorate. fun1();时,调用了MyDecorate.fun1();而在该方法里调用了Super. fun1();

也就是父类decoratefun1();,而父类的fun1()实现是Obj. fun1();这个Obj实际指向的类型是MyObj而不是OBJ,所以先打印了MyObj. fun1(),再打印了MyDecorate. fun1()

 

从上面流程可以看出所谓的装饰模式归根结底还是组合方式的变体,MyDecorate对象里面包含了从父类继承而来的OBJ obj;引用,并结合多态性的动态类型绑定,最终调用了MyObj这个被修饰类的fun1()。使用这种隐秘的组合方式实现了装饰类调用被装饰类的能力方法。明白这个模式对于应用java还是非常重要的,因为经常会出现,了解了其调用流程就能从容应对这类代码语句,做到心中有数


阅读更多
个人分类: java
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭