设计模式之代理模式

时间:2020-04-16
本文章向大家介绍设计模式之代理模式,主要包括设计模式之代理模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

代理模式通常分为静态代理和动态代理两种。

  • 静态代理

静态代理

public interface StaticSourceable {

    public void doMethod();
}

public class StaticSource implements StaticSourceable {

    public void doMethod() {
        System.out.println("业务处理。。。");
    }

}

public class StaticProxy implements StaticSourceable {

    StaticSource source;

    public StaticProxy() {
        // 在代理类的无参构造器中创建目标对象
        this.source = new StaticSource();
    }

    // 代理类对StaticSource的doMethod方法做了增强
    public void doMethod() {
        before();
        try {
            source.doMethod();
        } catch (Exception e) {
            exception();
        }
        after();
    }

    public void before() {
        System.out.println("进入方法。。。");
    }
    
    public void after() {
        System.out.println("执行结束。。。");
    }
    
    public void exception() {
        System.out.println("出现异常。。。");
    }
    
    public static void main(String[] args) {
        StaticSourceable source = new StaticProxy();
        source.doMethod();
    }
}
  • 动态代理

动态代理又分为JDK动态代理和CGLib动态代理。

  • JDK动态代理

JDK动态代理

// 目标类接口
public interface IMyJDKTarget {

    void doMethod();
    
}

// 目标类
public class MyJDKTargetImpl implements IMyJDKTarget {

    public void doMethod() {
        System.out.println("业务处理。。。");
    }

}

// 代理类
public class JDKProxyFactory implements InvocationHandler {

    // 目标对象
    private Object target;
    
    public JDKProxyFactory(Object target) {
        super();
        this.target = target;
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        before();
        // 调用目标对象方法
        Object object = method.invoke(target, args);
        after();
        return object;
    }
    
    public Object getProxy() {
        // 直接调用java.lang.reflect.Proxy的静态方法newProxyInstance
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }
    
    public void before() {
        System.out.println("进入方法。。。");
    }
    
    public void after() {
        System.out.println("执行结束。。。");
    }
    
    public static void main(String[] args) {
        IMyJDKTarget target = (IMyJDKTarget) new JDKProxyFactory(new MyJDKTargetImpl()).getProxy();
        target.doMethod();
    }
    
}
  • CGLib动态代理

CGLib动态代理

// 目标类(不需要接口)
public class MyCgLibTarget {

    public void doMethod() {
        System.out.println("业务处理。。。");
    }
}

// 代理类
public class CgLibProxyFactory implements MethodInterceptor {
    // 目标对象
    private Object target;
    
    public CgLibProxyFactory(Object target) {
        super();
        this.target = target;
    }
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        before();
        // 调用目标对象方法
        Object object = proxy.invoke(target, args);
        after();
        return object;
    }
    
    public Object getProxy() {
        // 创建增强器
        Enhancer enhancer = new Enhancer();
        // 设置需要增强的类的类对象
        enhancer.setSuperclass(target.getClass());
        // 设置回调函数
        enhancer.setCallback(this);
        // 获取增强之后的代理对象
        return enhancer.create();
    }
    
    public void before() {
        System.out.println("进入方法。。。");
    }
    
    public void after() {
        System.out.println("执行结束。。。");
    }
    
    public static void main(String[] args) {
        MyCgLibTarget target = (MyCgLibTarget) new CgLibProxyFactory(new MyCgLibTarget()).getProxy();
        target.doMethod();
    }

}

原文地址:https://www.cnblogs.com/scorpio-cat/p/12715222.html