黑马程序员技术交流社区

标题: 设计模式_代理模式 [打印本页]

作者: 小江哥    时间: 2018-8-3 20:38
标题: 设计模式_代理模式
本帖最后由 小江哥 于 2018-8-3 20:38 编辑

概述
代理模式为另一个对象提供一个替身或者占位符以控制对这个对象的访问
如下图所示
UML类图
代理模式类别
代码实现静态代理

[Java] 纯文本查看 复制代码
public interface Subject {

    void request();
}


// 请求的真实目标对象
public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("real subject execute request");
    }
}


// 代理对象
public class Proxy implements Subject {

    private RealSubject realSubject;

    public Proxy(RealSubject realSubject) {
        this.realSubject = realSubject;
    }

    @Override
    public void request() {
        System.out.println("before");
        try {
            realSubject.request();
        } catch (Exception e) {
            System.out.println("ex:" + e);
            throw e;
        } finally {
            System.out.println("after");
        }


    }
}

[Java] 纯文本查看 复制代码
public class Client {

    public static void main(String[] args) throws Exception {
        Subject subject = new Proxy(new RealSubject());

        subject.request();

    }
}


[Java] 纯文本查看 复制代码
before
real subject execute request
after


动态代理

jdk代理
[Java] 纯文本查看 复制代码
public class JdkProxySubject implements InvocationHandler {

    private RealSubject realSubject;

    public JdkProxySubject(RealSubject realSubject) {
        this.realSubject = realSubject;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("before");
        Object result = null;
        try {
            result = method.invoke(realSubject, args);
        } catch (Exception e) {
            System.out.println("ex" + e);
            throw e;
        } finally {
            System.out.println("after");
        }


        return result;
    }
}


[Java] 纯文本查看 复制代码
public class Client {

    public static void main(String[] args) throws Exception {
        Subject subject = (Subject) Proxy.newProxyInstance(Client.class
                .getClassLoader(), new Class[]{Subject.class}, new JdkProxySubject(new RealSubject()));

        subject.request();

    }
}


[Java] 纯文本查看 复制代码
before
real subject execute request
after


[Java] 纯文本查看 复制代码
public interface Subject {

    void request();

    void hello();
}


public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("real subject execute request");
    }

    @Override
    public void hello() {
        System.out.println("real subject execute hello");
    }
}

[Java] 纯文本查看 复制代码
public class Proxy implements Subject {

    private RealSubject realSubject;

    public Proxy(RealSubject realSubject) {
        this.realSubject = realSubject;
    }


    @Override
    public void hello() {
        ...
    }
}

[Java] 纯文本查看 复制代码
public class Client {

    public static void main(String[] args) throws Exception {
        Subject subject = (Subject) Proxy.newProxyInstance(Client.class
                .getClassLoader(), new Class[]{Subject.class}, new JdkProxySubject(new RealSubject()));

        subject.hello();

    }
}


[Java] 纯文本查看 复制代码
before
real subject execute hello
after



Cglib代理
[Java] 纯文本查看 复制代码
public class DemoMethodInterceptor implements MethodInterceptor {
    @Override
    public Object intercept(Object object, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("before in cglib");
        Object result = null;
        try {
            result = proxy.invokeSuper(object,args);
        }catch (Exception e){
            System.out.println("get ex :" + e.getMessage());
            throw e;
        }finally {
            System.out.println("after in cglib");
        }
        return result;
    }
}

[Java] 纯文本查看 复制代码
public class Client {

    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(RealSubject.class);
        enhancer.setCallback(new DemoMethodInterceptor());
        Subject subject = (Subject) enhancer.create();
        subject.request();
    }
}


[Java] 纯文本查看 复制代码
before in cglib
real subject execute request
after in cglib


JDK代理和Cglib代理区别


代理模式实例.png (20.89 KB, 下载次数: 7)

代理模式实例.png





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2