1、模式定义
- 代理模式:给某一个对象提供一个代理,并由代理对象控制对原对象的引用。
- 静态代理:工程师编辑代理类代码,实现代理模式;在编译期就生成了代理类。
- 基于 JDK 实现动态代理:通过jdk提供的工具方法 Proxy.newProxyInstance 动态构建全新的代理类(继承 Proxy 类,并持有 InvocationHandler 接口引用)字节码文件并实例化对象返回。(jdk 动态代理是由 java 内部的反射机制来实例化代理对象,并代理的调用委托类方法)
- 还有基于其它实现动态代理,这里不做详细描述,感兴趣的同学可以深入研究下。
2、代码实现
/**
* 接口对象
*/
public interface IPerson {
// 打印资料
void print();
}
/**
* 具体主题类
*/
public class Person implements IPerson {
/**
* 具体的业务逻辑实现
*/
@Override
public void print() {
System.out.println("张三打印资料...");
}
}
/**
* 代理类
*/
public class PersonProxy implements IPerson {
// 要代理的实现类
private IPerson person;
public PersonProxy(Person person) {
this.person = person;
}
@Override
public void print() {
System.out.println("静态代理开始打印...");
person.print();
System.out.println("静态代理结束打印...");
}
}
/**
* 客户端
*/
public class TestDemo {
public static void main(String[] args) {
Person person = new Person();
// 静态代理
PersonProxy personProxy = new PersonProxy(person);
personProxy.print();
}
}
/**
* 接口对象
*/
public interface IPerson {
// 打印资料
void print();
}
/**
* 具体主题类
*/
public class Person implements IPerson {
/**
* 具体的业务逻辑实现
*/
@Override
public void print() {
System.out.println("张三打印资料...");
}
}
/**
* 代理类
*/
public class ProxyFactory {
// 维护一个目标对象
private Object target;
public ProxyFactory(Object target) {
this.target = target;
}
public Object getProxyInstance() {
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("动态代理开始打印...");
//执行目标对象方法
Object returnValue = method.invoke(target, args);
System.out.println("动态代理结束打印...");
return returnValue;
}
});
}
}
/**
* 客户端
*/
public class TestDemo {
public static void main(String[] args) {
// 动态代理
IPerson person = new Person();
IPerson proxy = (IPerson) new ProxyFactory(person).getProxyInstance();
proxy.print();
}
}
3、常见使用场景
4、优缺点
- 优点:给对象增加了本地化的扩展性,增加了存取操作控制。
- 缺点:会产生多余的代理类。
5、参考资料
- https://www.jianshu.com/p/a0b39a6e60f5
- https://mp.weixin.qq.com/s/uNEhNvF3O0PJDm5BgOChaA