代理类和被代理的类都实现同一个接口,代理类可以根据条件决定是否执行被代理对象的方法。代理类里有一个被代理对象的属性,通过代理类的构造函数传输被代理对象来初始化它。代理类可以有自己的接口,接口可以定义代理相关的方法。

普通代理

将被代理对象的初始化放到代理类中,不允许直接初始化被代理类。必须通过创建代理对象来访问被代理对象。

强制代理

必须通过真实角色找到代理角色进行访问操作。真实角色的成员方法中判断是不是通过代理访问,如果不是就抛错。真实角色接口增加一个 getProxy 方法用于获取它的代理对象。

虚拟代理

在调用被代理对象方法时才初始化被代理对象,避免被代理对象较多时引起的初始化缓慢问题。

动态代理

被代理类必须实现一个接口。AOP。动态代理的初始化,接收一个 Class,接口,和一个用于实现接口方法的 InvocationHandler。全部由 InvocationHandler.invoke 执行接口真实对象的方法,因此可以在执行前、执行后插入一些逻辑。