静态代理:
代理,大家应该都不陌生,就是我帮你去做一些事情。比如说,结婚。
现在结婚,大家都去找婚庆公司,谁结婚啊,是不是你结婚啊。你结婚,但是你,你什么都不用去做,婚庆公司帮你。帮你布置现场,帮你去把所有人招过来。帮你选地址,给你布置场景,等等。反正是它帮你做的。
最后,结婚的人是你,你就是一个真实角色。
结婚呢,结婚是你们两都要去做的事情。
用代码给大家说一下什么叫代理模式:
思路:
你:真实角色
婚庆公司:代理角色,帮你处理结婚的事
结婚:都实现结婚的接口即可
1 package com.thread.proxystatic; 2 3 public class StaticProxy { 4 public static void main(String[] args) { 5 //用婚庆公司去结婚,婚庆公司调用了一个方法,叫HappyMarry(),但是结婚的人是你, 6 //并没有通过你去直接调,而是通过婚庆公司,它代理你去结婚,但是结婚的人还是你 7 //new WeddingCompany(new You()).HappyMarry(); 8 WeddingCompany weddingCompany = new WeddingCompany(new You()); 9 weddingCompany.HappyMarry(); 10 } 11 } 12 13 interface Marry { 14 //人间四大喜事: 15 //久旱逢甘露, 16 //他乡遇故知。 17 //洞房花烛夜, 18 //金榜题名时。 19 public abstract void HappyMarry(); 20 } 21 22 //真实角色,你去结婚 23 class You implements Marry { 24 25 @Override 26 public void HappyMarry() { 27 System.out.println("你要结婚了,超级开心"); 28 } 29 } 30 31 //代理角色,帮助你结婚 32 class WeddingCompany implements Marry { 33 //代理谁-->真实角色 34 private Marry target;//创建一个变量,通过构造方法把真实对象传进去 35 36 public WeddingCompany(Marry target) { 37 this.target = target; 38 } 39 40 @Override 41 public void HappyMarry() { 42 before(); 43 this.target.HappyMarry();//这是真实对象,调用一个结婚 44 after(); 45 } 46 47 private void before() { 48 System.out.println("结婚之前,布置婚礼现场"); 49 } 50 51 private void after() { 52 System.out.println("结婚之后,收尾款"); 53 } 54 55 56 } 57 58 结果: 59 结婚之前,布置婚礼现场 60 你要结婚了,超级开心 61 结婚之后,收尾款
静态代理总结:
- 真实对象(目标对象)和代理对象都要实现同一个接口
- 代理对象要代理真实角色,真实角色就是你
- 代理对象必须要有个参数,创建一个变量,通过构造方法, 把真实对象传进去
- 传进去后,调用HappyMarry()这个方法。
- 于是乎,你们就结婚了
- 结婚用不着你干,你只要把你交给婚庆公司,你只要花钱。
- 婚庆公司呢,结婚之前布置一下现场。结婚之后呢,收一下尾款。
好处:
- 代理对象可以做很多真实对象做不了的事情
- 真实对象就专注做自己的事情
静态代理对比Thread
Thread就相当于婚庆公司,代理中间的真实的一个Runnable接口,调用了一个start(),start()是Thread类弄的,他们都有一个共同的run()
婚庆公司WeddingCompany,代理你You,你调用了一个结婚方法HappyMarry(),结婚方法是接口中的
1 new Thread(()-> System.out.println("我爱你")).start(); 2 new WeddingCompany(new You()).HappyMarry();