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还是非常重要的,因为经常会出现,了解了其调用流程就能从容应对这类代码语句,做到心中有数


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值