设计模式之代理模式——通俗易懂

静态代理:

例子:张三因为老婆经常打他,想离婚,找律师帮忙打官司。

角色:

实现静态代理的步骤:

1.创建抽象角色【接口】

 

2.创建真实角色,并实现抽象角色【接口】

3.创建代理角色,并实现抽象角色。代理角色要进行功能增强

4.创建用户角色,也就是测试 

 但是,如果李四和王五也被老婆打了要离婚,又需要李四的律师和王五的律师。也就是说,多一个真实角色,就会多一个代理角色,代码量会翻倍。所以,可以找一个万能的律师,张三、李四、王五的案子都可以接。这也是动态代理的思想。

加深理解:

写一个简单的增删改查的功能:

测试:

 现在有一个需求:给每一个方法都增加一个日志功能

但是这样有两个问题:不仅需要改变原来的代码,而且当方法很多的时候,每个方法都要手动添加日志,假设是添加的是其他的功能,这个功能有成千上万行,代码量就会非常的大。所以可以使用静态代理的方式。

在不改变原来代码的基础上,增加日志功能:

测试:

这个有点类似Spring AOP的思想,只不过Spring AOP更高级一点,用的是动态代理。

 动态代理:

原理:通过JDK的反射机制,动态地创建代理类,不需要我们自己手动写。

分类:

1.jdk动态代理(主要):java.lang.reflect包中的InvocationHandler接口、Method类、Proxy类    

Method类:

先写一个简单的Hello:

测试: 

现在有一个要求: 通过反射机制执行sayHello()方法

 InvocationHandler接口:调用处理器,表示代理类要干啥

方法作用返回值
invoke(Object proxy, Method method, Object[] args)

表示代理对象proxy要完成的功能:调用目标方法method+功能增强。args是目标方法method要传入的参数。

Object

Proxy类:创建代理对象

方法作用修饰符和返回值
newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler)

创建代理对象

参数:

1.ClassLoader loader:用户的类加载器,负责向内存中加载对象的。可以使用反射获取对象的ClassLoader

2.Class<?>[] interfaces:目标对象实现的接口(抽象角色),也可以通过反射获取。

3.InvocationHandler h:我们自己写的,代理类要完成的功能

static Object

返回值就是代理对象

JDK动态代理实现:

例子:张三、李四、王五,因为经常被老婆打,想离婚,找万能律师帮忙打官司。

实现动态代理的步骤:
1.创建接口,抽象角色

2.创建真实角色并实现抽象角色

 

  

3.创建InvocationHandler接口的实现类,在invoke方法中,完成代理角色的功能:①调用真实角色的方法        ②增强功能

补充:图里的传入的target应该是一个接口类型。应该是 Speaker speak = new ZhangSan();

然后把speaker当成target传进去。而不是ZhangSan zhangSan = new ZhangSan();然后把zhangSan当成target传进去。因为这是动态代理,会写死了就不动态了。

4.使用Proxy类的静态方法,创建代理对象,并把返回值转为接口类型

补充:new的是李四,图里的speaker2可以理解为liSiLawyer。如果new的是王五,那么speaker2就可以理解为wangWuLawyer

2.cglib动态代理(了解):第三方的工具库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值