java之代理模式

1.代理模式

    代理模式为其它对象提供一种代理以控制这个对象的访问,主要解决在直接访问对象时带来的问题,有些对象由于某些原因,直接访问会给使用者或者系统带来很多麻烦,此时我们可以在访问此对象时加一个对该对象的访问层;不能直接操作目标对象,要访问它必须通过代理类访问,代理类可以完成目标对象的操作,还可以延展其他的操作,脏活累活它全揽;

2.静态代理

静态代理类必须持有目标对象的引用,以便达到操作目标对象的目的

①抽象接口类

public interface Subject {
    void visit(int channel);
}

②目标(真实)对象类

**
 * 委托类
 */
public class RealSubject implements Subject {

    @Override
    public void visit(int channel) {
        if(channel == 1) {
            System.out.println("我是静态委托类");
        }else {
            System.out.println("我是动态委托类");
        }


    }
}

③静态代理类

public class StaticProxy implements Subject {

    private RealSubject subject;

    public StaticProxy(RealSubject subject){
     this.subject = subject;
    }

    @Override
    public void visit(int channel) {
     subject.visit(channel);
    }

}

④测试类

public class StaticClient {

    public static void main(String[] args) {
        StaticProxy proxySubject = new StaticProxy(new RealSubject()); //代理类
        proxySubject.visit(1);
    }

}

效果图:


3.Jdk动态代理

如果目标对象实现了接口,则采用jdk动态代理

①Jdk动态代理类

/**
 * 动态代理类
 */
public class JDKProxy implements InvocationHandler {

    private Object target;
    public JDKProxy(Object object) {
        this.target = object;
    }
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = method.invoke(target, args);
        return result;
    }
}

②测试类

public static void main(String[] args) {
    Subject realSubject = new RealSubject();
    JDKProxy proxy = new JDKProxy(realSubject);
    ClassLoader classLoader = realSubject.getClass().getClassLoader();
    Subject subject = (Subject)Proxy.newProxyInstance(classLoader, new Class[]{Subject.class}, proxy);
    subject.visit(2);
}

效果图:


4.Cglib动态代理

如果目标对象没有实现接口,则采用cglib动态代理;spring-Aop是典型的cglib动态代理案例

①目标对象类

public class CglibSubject {

    public void visit(){
        System.out.println("我是cglib动态代理");
    }
}

②cglib动态代理类

/**
 * @auther zx
 * @date 2018/6/20 11:15
 *
 * 引入的目标对象没有实现接口,使用cglib代理
 */
public class CglibProxy implements MethodInterceptor {
    private Object target;

    public CglibProxy(Object object){
        this.target = object;
    }

    //给目标对象创建一个代理对象
    public Object getProxyInstance(){
        //1.工具类
        Enhancer en = new Enhancer();
        //2.设置父类
        en.setSuperclass(target.getClass());
        //3.设置回调函数
        en.setCallback(this);
        //4.创建子类(代理对象)
        return en.create();

    }

    @Override
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        //执行目标对象的方法
        Object returnValue = method.invoke(target, args);
        
        return returnValue;
    }
}

③测试类

public class CglibClient {

    public static void main(String[] args) {
        //目标对象
        CglibSubject target = new CglibSubject();
        //代理对象
        CglibSubject proxy = (CglibSubject)new CglibProxy(target).getProxyInstance();
        //执行代理对象的方法
        proxy.visit();
    }


}

效果图:


好了,我是张星,欢迎加入博主技术交流群,群号:526601468

猜你喜欢

转载自blog.csdn.net/zhangxing52077/article/details/80752116