结构型设计模式
- 代理模式(Proxy Pattern)
定义:为其他对象提供一种代理,以控制这个对象的访问,在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端与目标对象之间起到中介的作用
应用目的:保护目标对象,动态增强目标对象,代理模式分为静态代理和动态代理
角色:抽象目标角色,目标角色,代理角色
代理对象通过实现和目标对象所实现的接口,然后在实现类中,持有目标对象,于是在代理类中对抽象方法实现,并在调用目标对象的行为的基础上,增加自己的行为增强
通用静态代理方式实现:
抽象目标角色
package com.ProxyPattern;
public interface Isubject {
void request();
void doSomthing();
}
目标角色
package com.ProxyPattern;
public class RealSubject implements Isubject {
@Override
public void request() {
System.out.println("真实角色的自带行为");
}
@Override
public void doSomthing() {
System.out.println("真实角色自带的另一个行为");
}
}
代理类和测试
package com.ProxyPattern;
public class ProxySubject implements Isubject {
private Isubject real;
@Override
public void request() {
before();
real.request();
after();
}
@Override
public void doSomthing() {
System.out.println("啥玩意儿");
}
private void after() {
System.out.println("在目标行为运行前代理织入行为增强");
}
private void before() {
System.out.println("在目标行为运行后代理织入行为增强");
}
public ProxySubject(Isubject real){
this.real=real;
}
public static void main(String[] args) {
new ProxySubject(new RealSubject()).request();
}
}
JDK中有内置的Proxy类(java.lang.reflect)做动态代理从原理上看是对对象的的代理
使用上主要有InvocationHandler,Method,Proxy三个类和接口
Proxy的newProxyInstance()方法返回代理类,需要提供三个参数:目标对象的类加载器,目标对象类所实现的接口,InvocationHandler接口的实例
InvocationHandler接口定义了invoke()方法,入参:目标实例,目标对象的方法(Method类型 ),参数Object数组,需要用户去是实现,invoke()方法是对目标对象所有方法的增强逻辑 我的理解,Proxy.newProxyInstance()通过入参用户实现的InvocationHandler对象中的Invoke()方法,来构造代理对象所代理的目标对象的方法的代理方法,在Invoke()方法里面,可以通过入参的methon,用method.invoke调用目标对象的方法,也可以不调用,完全去“覆盖”目标对象的方法。在定义InvocationHandler的实现时,经常习惯性的把获取代理类的方法封装在其中,然后在使用时直接调用即可
package com.ProxyPattern;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JDKproxy implements InvocationHandler {
private Isubject target;
public Isubject getInstance(Isubject target){
this.target=target;
Class extends Isubject> aClass = target.getClass();
return (Isubject) Proxy.newProxyInstance(aClass.getClassLoader(),aClass.getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object result = method.invoke(this.target, args);
after();
return result;
}
private void after() {
System.out.println("在目标行为运行前代理织入行为增强");
}
private void before() {
System.out.println("在目标行为运行后代理织入行为增强");
}
public static void main(String[] args) {
Isubject proxy = new JDKproxy().getInstance(new RealSubject());
proxy.request();
proxy.doSomthing();
}
}



