作为一个大学生,很多课结束时,老师会要求我写一篇论文或者文章。我不想写这个论文,就让室友帮我写。结果就是:我并没有写一个字,但是我的论文完成了。在这里,我的室友就相当于我的代理,他代表我写了论文。
所谓代理,就是自己的事情让别人做,当然,别人可以在完成这件事的基础上多做一些别的,这就叫增强。
下面是静态代理的一个简单实现:
/*
* IHuman接口,定义“吃”和“睡”方法
*/
interface IHuman{
public void eat();
public void sleep();
}
/*
* Human类,实现IHuman接口
*/
class Human implements IHuman{
public void eat() {
System.out.println("吃------");
}
public void sleep() {
System.out.println("睡------");
}
}
/*
* 代理类,实现IHuman接口
*/
class HumanProxy implements IHuman{
IHuman human;
/*
* 通过构造方法注入变量human
* 也可以用setter方法注入,即定义方法setHuman(IHuman human){...}给human赋值
*/
public HumanProxy(IHuman human) {
this.human=human;
}
public void eat() { //增强human的eat方法,在其后打印时间
human.eat();
System.out.println("吃的时间是6点");
}
public void sleep() { //增强human的sleep方法,在其后打印时间
human.sleep();
System.out.println("睡的时间是9点");
}
}
//测试
public class test {
public static void main(String[]args) {
Human human=new Human(); //真实对象
HumanProxy humanProxy=new HumanProxy(human); //代理对象
//代理方法
humanProxy.eat();
humanProxy.sleep();
}
}
可以看到通过humanProxy这个代理对象,完成了human里面的方法,同时还对其进行了增强,即打印时间。
总体来说,静态代理比较简单,但是对于理解何为代理很有帮助。
另外,静态代理比较死板,被代理对象的类型是确定的。如果要通过一个代理类去代理任意类,就需要使用动态代理。
下面是我在学习时不明白的地方以及理解:
1、代理类HumanProxy为什么需要实现IHuman接口?
因为其需要知道被代理者拥有的方法,比如说eat()、sleep(),然后再对这些方法进行增强。
2、代理有什么用,为什么我不能在Human类的方法里直接完成打印时间(如下)?
/*
* Human类,实现IHuman接口
*/
class Human implements IHuman{
public void eat() {
System.out.println("吃------");
System.out.println("吃的时间是6点");
}
public void sleep() {
System.out.println("睡------");
System.out.println("睡的时间是9点");
}
}
因为通过使用代理,Human类中的方法只需要关心其核心功能,比如说“吃”,而其他事务(打印时间)可以通过代理完成,将事务与核心功能分开,使得整个项目结构清晰。另外,使用代理可以提高程序的扩展性。