今天学习代理模式,简单记一下笔记,代理模式其实就是使客户端在使用目标对象时,不直接操作目标对象,而是通过代理对象来操作目标对象,代理对象是对目标对象的增强。
今天先说下静态代理,静态代理的实现模式一般是:首先创建一个接口(JDK代理都是面向接口的),然后创建具体实现类来实现这个接口,然后再创建一个代理类同样实现这个接口,不同之处在于,具体实现类的方法中需要将接口中定义的方法的业务逻辑功能实现,而代理类中的方法只要调用具体类中的对应方法即可,这样我们在需要使用接口中的某个方法的功能时直接调用代理类的方法即可,将具体的实现类隐藏在底层,先用一个简单的例子来说明。
场景:张三是个IT狗,到了找媳妇的年龄了,但是天天加班没时间去撩妹,周围都是一群IT男,张三又不想搞基。张三他爸看在眼里急在心里,着急抱孙子,于是,和张三一合计,决定亲自出马去相亲!不对,是亲自出马帮张三相亲!他爸问张三有啥要求,张三就三个字:“白富美”,张老三就去了公园的相亲角,开始帮儿子物色相亲对象,只要是符合张三标准的女性,他都去聊一下,终于找到一个比较满意的,双方来电了,开始和张三交往,他爸很开心,拿出小本本把此次经验记好,以备不时之需。
场景描述完了,这就是静态代理在生活中的使用场景,简单的说就是,张三他爸代理张三找老婆这个事。上代码:
接口:
package com.rq.pattern.proxy.staticproxy;
/**
* Title: IPerson
* Description: 被代理对象
* @author RQ
* @date 2020年3月21日
*/
public interface IPerson {
/**
* Description: 找老婆
*/
public void findLove();
}
实现类:
package com.rq.pattern.proxy.staticproxy;
/**
* Title: ZhangSan
* Description: 张三的实体类
* @author RQ
* @date 2020年3月21日
*/
public class ZhangSan implements IPerson {
/**
* 张三找老婆
*/
public void findLove() {
System.out.println("张三找老婆要求:白富美");
}
}
代理类:
package com.rq.pattern.proxy.staticproxy;
/**
* Title: ZhangsanFather
* Description: 张三的爸
* @author RQ
* @date 2020年3月21日
*/
public class ZhangsanFather implements IPerson {
private ZhangSan zhangsan;
public ZhangsanFather(ZhangSan zhangsan) {
super();
this.zhangsan = zhangsan;
}
/**
* 张三的爸,也在找老婆,当然了,其实是给他儿子张三找
*/
public void findLove() {
//帮儿子赵三找老婆之前,得先做些准备工作
before();
zhangsan.findLove();
//帮儿子找老婆后,做下总结,给下次自己找时留下经验
after();
}
private void before() {
System.out.println("张三他爸去公园相亲角溜达,物色对象");
}
private void after() {
System.out.println("张三他爸拿小本本记好笔记");
}
}
测试类:
package com.rq.pattern.proxy;
import com.rq.pattern.proxy.staticproxy.ZhangSan;
import com.rq.pattern.proxy.staticproxy.ZhangsanFather;
public class StaticProxyTest {
public static void main(String[] args) {
ZhangsanFather father = new ZhangsanFather(new ZhangSan());
father.findLove();
}
}
运行结果:
张三他爸去公园相亲角溜达,物色对象
张三找老婆要求:白富美
张三他爸拿小本本记好笔记
看上去是执行的张三他爸找老婆的方法,其实,调用的还是张三找老婆的方法,同时张三他爸在帮张三找老婆之前和之后,还做了额外的几件事,即对目标对象的增强,这就是静态代理最简单的一个实现,下次继续分析静态代理的缺点以及如何从静态代理转为动态代理。