理论上来说,一个类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的对象执行了MyObj的fun1()能力,在执行完该能力后再执行自己的能力,但是跟前面的继承和组合不同,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();
也就是父类decorate的fun1();,而父类的fun1()实现是Obj. fun1();这个Obj实际指向的类型是MyObj而不是OBJ,所以先打印了MyObj. fun1(),再打印了MyDecorate. fun1()
从上面流程可以看出所谓的装饰模式归根结底还是组合方式的变体,MyDecorate对象里面包含了从父类继承而来的OBJ obj;引用,并结合多态性的动态类型绑定,最终调用了MyObj这个被修饰类的fun1()。使用这种隐秘的组合方式实现了装饰类调用被装饰类的能力方法。明白这个模式对于应用java还是非常重要的,因为经常会出现,了解了其调用流程就能从容应对这类代码语句,做到心中有数