- 什么是代理模式
代理模式是我们常用到的一种设计模式,代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问。代理模式的思想是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象。这些额外的操作通常需要与实际对象进行通信。 - 代理模式作用
可以在不修改代理对象代码的基础上,通过扩展代理类,进行一些功能的附加与增强(如:Spring AOP编写切面日志)。
代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。 - 代理的划分
在Java中主要分为静态代理和动态代理模式,动态代理是一种比较常用的代理模式,它让我们不需要手动去编写代理类,而只要去实现代理的扩展即可。 - 静态代理
面向接口的编程,代理类与真实类继承自同一个接口(或者继承某个类)。
- 示例代码:
public interface IPersonService {
void personInfo();
}
public class PersonServiceImpl implements IPersonService {
@Override
public void personInfo() {
System.out.println("输出客户信息......");
}
}
public class Proxy implements IPersonService {
IPersonService person = new PersonServiceImpl();
@Override
public void personInfo() {
person.personInfo();
/**扩展方法*/
after();
}
private void after() {
System.out.println("输出客户身份信息.......");
}
}
执行静态代理:
public static void main(String[] args) {
IPersonService person = new Proxy();
person.personInfo();
}
输出结果:
输出客户信息......
输出客户身份信息.......
- 动态代理
动态代理指的代理类在运行期动态创建,通过java反射机制,获取某个被代理类的所有接口,并创建代理类。
动态代理使我们免于去重写接口中的方法,而着重于去扩展相应的功能或是方法的增强,与静态代理相比简单了不少,减少了项目中的业务量。
示例代码:
public class Proxy implements InvocationHandler {
private Object obj;
/**
* 绑定委托对象并返回代理类
* @param obj
* @return
* 作者:will
* 日期:2019年1月28日下午3:25:55
*/
public Object bind(Object obj) {
this.obj= obj;
/**通过"Proxy"类提供的一个newProxyInstance方法用来创建一个对象的代理对象*/
return java.lang.reflect.Proxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
/**在调用具体函数方法前,执行功能扩展*/
before();
/**在invoke方法编码指定返回的代理对象干的工作*/
result = method.invoke(obj, args);
/**在调用具体函数方法后,执行功能处理*/
after();
return result;
}
private void before() {
System.out.println("执行实现方法前输出......");
}
private void after() {
System.out.println("输出客户身份信息........");
}
}
通过 Proxy.newProxyInstance 创建的代理对象是在jvm运行时动态生成的一个对象
执行动态代理。
public static void main(String[] args) {
Proxy proxy = new Proxy();
// 返回一个实现该类所有接口的代理类
IPersonService person = (IPersonService) proxy.bind(new PersonServiceImpl());
person.personInfo();
}
输出结果:
执行实现方法前输出......
输出客户信息......
输出客户身份信息........