定义
为对象提供一种代理来控制其他对象的访问,一般一个对象不适合或不能直接访问另一对象,而代理可以在对象之间起到中介作用。
角色
- 抽象角色:真实角色和代理角色共同的接口
- 代理角色:代理角色内部含有对真实对象的引用,从而可以操纵真实对象。同时代理对象有和真实对象同样的接口,以便能随时替代真实对象。
- 真实角色:就是我们想要访问的角色。
分类
静态代理:代理类的字节码文件在运行前就已经存在,代理对象和目标对象运行前就已存在。
动态代理:代理类的字节码文件是jvm在运行时根据反射机制生成的,对象的关系在运行时确定
动态代理示例
抽象角色
//抽象角色
interface User{
public void speak();
public void done();
}
真实角色
//真实角色
class UserInfo implements User{
@Override
public void speak() {
System.out.println("hello~");
}
@Override
public void done() {
System.out.println("running~");
}
}
代理角色处理器
//代理角色处理器
class UserHandler implements InvocationHandler{
private User user;
public UserHandler(User user){
this.user = user;
}
//生产被代理的对象
public User getUserInstance(){
User uiProxy = (User) Proxy.newProxyInstance(UserHandler.class.getClassLoader(),
UserInfo.class.getInterfaces(),
this);
return uiProxy;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("方法前准备");
Object invoke = method.invoke(user, args);//被代理对象要执行的方法
System.out.println("方法后结束");
return invoke;
}
}
优点
- 只需要关注业务逻辑本身,保证了业务的重用性
- 能够协调调用者与被调用者,一定程度上减少了系统耦合性
缺点
- 增加了代理对象,可能会降低请求的速度
- 代理过程较为复杂