结构型模式之代理模式

工厂模式分为三种
1. 静待代理
2. 动态代理
3. Cglib代理

静待代理

点评:需要被代理类实现一个接口

/**
 * 静态代理
 */
public class StaticProxyPattern {

    //抽象主题
    interface Subject{
        //定义一个请求方法
        void request();
    }

    //代理主题
    class ProxySubject implements Subject{
        private Subject subject;

        public ProxySubject(Subject subject) {
            this.subject = subject;
        }

        @Override
        public void request() {
            this.beforeRequest();
            subject.request();
            this.afterRequest();
        }
        //预处理
        private void beforeRequest(){}
        //请求后处理
        private void afterRequest(){}
    }

    //真实主题
    class RealSubject implements Subject{

        @Override
        public void request() {
            //业务逻辑
        }
    }
}
动态代理

点评:调用反射生成代理对象 需要被代理类实现接口

/**
 * 动态代理
 *
 * 动态代理通过反射类Proxy和InvocationHandler回调接口实现,要求委托类必须实现一个接口,只能对该类接口中定义的方法实现代理
 */
public class DynamicProxyPattern {

    //测试
    public static void main(String[] args) {
        // jdk动态代理测试
        Subject subject = new JDKDynamicProxy(new RealSubject()).getProxy();
        JDKDynamicProxy jdkDynamicProxy = new JDKDynamicProxy(new Object());
        subject.doSomething();
    }

}
//接口
interface Subject {
    void doSomething();
}

//被代理类
class RealSubject implements Subject {
    @Override
    public void doSomething() {
        System.out.println("RealSubject do something");
    }
}

//代理类
class JDKDynamicProxy implements InvocationHandler {
    private Object target;

    public JDKDynamicProxy(Object target) {
        this.target = target;
    }

    /**
     * 获取被代理接口实例对象
     *
     * @param 
     * @return
     */
    public  T getProxy() {
        return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Do something before");
        Object result = method.invoke(target, args);
        System.out.println("Do something after");
        return result;
    }

}
Cglib代理

点评:被代理类不用实现任何接口

/**
 * 动态代理
 * 1.需要引入 cglib.jar   或直接引入spring 即可.
 * 2.代理类不能为final
 * 3.若目标对象的方法 为 final/static,那么就不会被拦截.即不会执行目标额外的业务方法.
 *
 *
 */
public class CglibProxyPattern {
    //生成代理
    public static void main(String[] args) throws IOException {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(UserService.class);
        enhancer.setCallback(new MyMethodInterceptor());
        UserService userService = (UserService)enhancer.create();
        userService.delete(5);
    }
}

class UserService{
    public void add() {
        System.out.println("This is add service");
    }
    public void delete(int id) {
        System.out.println("This is delete service:delete " + id );
    }
}

//代理方法逻辑
class MyMethodInterceptor implements MethodInterceptor {
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("Before:" + method);
        Object object = methodProxy.invokeSuper(o, objects);
        System.out.println("After:" + method);
        return object;
    }
}

你可能感兴趣的:(结构型模式之代理模式)