1. 一般情况下,想要对一个现有的方法添加一些额外的操作有这样几种办法:
比如:
public void test(){
System.out.println("hello world");
}
在这个方法输出hello world前添加一个log记录:(这里我们简单就输出一下)
System.out.println("log");
1.直接改源代码,直接添加代码:
public void test(){
System.out.println("log");
System.out.println("hello world");
}
这样做非常不灵活,死板,如果有上千个方法都要添加log实现,就不行了。
2.使用继承,创建一个子类继承当前类,然后调用super方法实现。
class childclass extends fatherclass{
public void test(){
System.out.println("log");
super.test();
}
}
这个比改源代码好很多,但是耦合性还是很高,一旦父类发生改变,所有的子类都要变化。同时,我如果想要把两个父类的应用合并,比如说要给另外一个类的save方法添加相同的log,我就得再写一个子类去添加log记录,因为继承永远是单线操作的,你不能同时继承两个类。
3.使用组合,相当于把继承改为实现接口,因为多个类可以实现同一个接口,这样的话不同的类可以实现相互的调用。
class test1 implements interfaceOriginal(){
public void test(){
System.out.println("hello world");
}
}
class test2 implements interfaceOriginal(){
interfaceOriginal inter = new test2(); //new 一个test2的对象
public void test(){
System.out.println("log");
inter.save();
}
}
如果我们想要在这基础之上把两个应用合并,比如在加上log上面再加上时间记录 System.out.println("time");
class test3 implements interfaceOriginal(){
interfaceOriginal inter2 = new test2();
public void test(){
System.out.println("time");
inter2.test();//这个test已经在前面添加了log记录。
}
}
注意这里的区别,继承无法给其他不是父类的类添加代码。比如这里test2 是另外一个类,他和test1之间没有相互继承,那么如果test3继承了test1,他并不能对test2添加方法。继承是单线的操作。
但是这样套来套去并还不够好,如果有1000个方法需要处理,代码量还是很大。
4.这个时候就是动态代理了。动态的遍历所有方法,动态的添加想要添加的任意一个操作,比如log或者time。