静态代理(线程底部的实现原理)
- 静态代理是一种设计模式,是线程底部的实现原理
先来学习一下什么是静态代理?(以结婚实例来学习理解)
实例:(结婚)
① 首先,需要一个结婚接口,在里面写需要实现的结婚方法;
- 结婚对象实现的时候,结婚方法只写自己能做的事情;
- 结婚代理实现的时候,结婚方法写代理应该做的事情(包含了操纵结婚对象让他做他应该做的事情)
interface Marry{//相当于线程中的Runnable接口
public void happyMarry();//相当于run方法
}
② 然后,需要一个结婚对象类去实现结婚接口,重写结婚方法,这里只要重写结婚对象在已经找了代理之后还需要自己做的事情就好;
//相当于线程中程序员写的部分
class QuQianJin implements Marry{//相当于线程中程序员写的实现Runnable接口的方法
public void happyMarry(){//相当于线程中程序员写的重写的run方法
System.out.println("瞿千金今天结婚啦!");
}
}
③ 再然后,需要一个结婚代理类实现结婚接口,重写结婚方法
- 代理类里面需要包含结婚对象(别忘了创建构造方法),这样在重写自己结婚方法时就可以调用结婚对象的结婚方法;
- 代理类要处理结婚前后的事情,所以还有结婚前方法和结婚后方法;
- 在重写结婚方法时,先调用结婚前方法,然后调用结婚对象的结婚方法(让结婚对象做自己结婚时应该做的事情,这个事情是代理无法,也不应该去做的事情),最后调用结婚后方法
public class TestThread7 implements Marry{//相当于线程中的Thread类,Thread类其实就相当于一个代理人的身份
private QuQianJin qianJin;
public TestThread7(QuQianJin qianJin) {
this.qianJin = qianJin;
}
@Override
public void happyMarry(){
before();
qianJin.happyMarry();
after();
}
public void before(){
System.out.println("结婚前准备!");
}
public void after(){
System.out.println("结婚后收尾!");
}
}
④ 最后,写main函数(将结婚对象塞到结婚代理对象中,结婚代理去调用结婚方法,在结婚代理的结婚方法中也调用了结婚对象的结婚方法)
public static void main(String[] args) {
QuQianJin qianJin =new QuQianJin();
TestThread7 thread=new TestThread7(qianJin);
thread.happyMarry();
}
整体代码就是:
interface Marry{//相当于线程中的Runnable接口
public void happyMarry();//相当于run方法
}
//相当于线程中程序员写的部分
class QuQianJin implements Marry{//相当于线程中程序员写的实现Runnable接口的方法
public void happyMarry(){//相当于线程中程序员写的重写的run方法
System.out.println("瞿千金今天结婚啦!");
}
public static void main(String[] args) {
QuQianJin qianJin =new QuQianJin();
TestThread7 thread=new TestThread7(qianJin);
thread.happyMarry();
}
}
public class TestThread7 implements Marry{//相当于线程中的Thread类,Thread类其实就相当于一个代理人的身份
private QuQianJin qianJin;
public TestThread7(QuQianJin qianJin) {
this.qianJin = qianJin;
}
@Override
public void happyMarry(){
before();
qianJin.happyMarry();
after();
}
public void before(){
System.out.println("结婚前准备!");
}
public void after(){
System.out.println("结婚后收尾!");
}
}
结果:
结婚前准备!
瞿千金今天结婚啦!
结婚后收尾!
- 用了代理模式之后,接口和代理类是我们一开始固定写好的,后面需要代理的客户对象只需要重写好接口中的方法,这样我们代理类对象在塞入了客户对象后,就可以执行代理操作,帮助客户完成业务;
- 代理类和客户类都要实现同一个接口
- 好处:① 代理对象可以做客户对象做不了的事情;② 真实对象专注于自己要做的事情