代理模式与静态代理
保留所有版权,请引用而不是转载本文(原文地址 https://yeecode.top/blog/04/ )。
1 代理模式
1.1 定义
代理模式:对某一个目标对象提供它的代理对象,并且由代理对象控制对原对象的引用。
例如,我们想访问某个对象A时,不能直接访问,需要由对象A的代理对象A Proxy进行代理。通俗来说,A Proxy我们可以认为是A的助理、中介、对外联络人。
1.2 作用
隔离作用:可以防止对目标对象的直接访问,实现目标对象与外部的隔离,从而提供安全保障等。例如:在代理中增加权限身份验证。
扩展功能:代理对象可以在目标对象的基础上增加功能。例如:Java切面操作通过建立代理实现。
直接替换:代理对象可以直接替换目标对象的功能,带来全新的实现方式。例如:RPC通过建立代理,直接实现了不存在的接口实现(消费者中只有接口,没有实现类,RPC直接把对实现类的访问转走了)。
2 静态代理
静态代理就是按照代理模式书写的代码,其特点是代理类和目标类在代码中是确定的,因此是静态的。
我们举例子进行介绍。
首先,写出目标类和代理类共同需要实现的接口,我们假设只有一个打招呼的功能。
public interface UserInterface {
void sayHello(String name);
}
目标类实现如下:
public class User implements UserInterface {
@Override
public void sayHello(String name) {
System.out.println("hello " + name);
}
}
代理类实现如下:
public class UserProxy implements UserInterface {
private UserInterface target;
public UserProxy (UserInterface target) {
this.target = target;
}
@Override
public void sayHello(String name) {
System.out.println("pre words");
target.sayHello(name);
System.out.println("post words");
}
}
测试方法如下:
public class Main {
public static void main(String[] args) {
// 生成被代理对象
User user = new User();
// 生成代理,顺便告诉代理他要代理谁
UserProxy userProxy = new UserProxy(user);
// 触发代理方法
userProxy.sayHello("Tom");
}
}
我们看到输出如下:
pre words
hello Tom
post words
通过静态代理,我们在目标方法的前后增加了一些操作。
但是,静态代理显然不够灵活。
- 必须要为每个对象创建一个实现了相同接口的代理对象,并且代理对象中的方法也要设置的和原对象一致。因此任何目标对象的变动,代理对象都要变
- 所有代码写死了,不够灵活,不能在运行时改变。
这时,就需要动态代理。他能在代码运行时动态地改变某个对象的代理,并且能为代理对象动态地增加方法、增加行为。
在后面的文章中,我们会介绍动态代理的实现。
可以访问个人知乎阅读更多文章:易哥(https://www.zhihu.com/people/yeecode),欢迎关注。