首页 > 代码库 > 设计模式-代理模式(Proxy)

设计模式-代理模式(Proxy)

一、代理的概念和作用

代理模式给某一个对象提供了一个代理对象,并由代理对象控制对原对象的引用

在一些情况下,一个客户端不想或者不能够直接引用一个对象而代理对象可以再客户端和目标对象之间起到中介作用。

 

一、静态代理

真实主题和静态主题共同的接口

public interface Subject {    void request();}

真实主题类

public class RealSubject implements Subject{    @Override    public void request() {        System.out.println("操作");    }}

代理类

public class ProxySubject implements Subject{        private Subject realSubject;        /**     * 通过构造器将被代理的角色传入进来     */    public ProxySubject(Subject realSubject){        this.realSubject=realSubject;    }        public void preRequest(){        System.out.println("增强操作:before操作");    }        @Override    public void request() {        //前置增强        preRequest();        realSubject.request();//原操作        //后置增强        postRequest();    }        public void postRequest(){        System.out.println("增强操作:after操作");    }}

客户端调用

public class Client {        public static void main(String[] args) {        //真实角色        Subject realSubject = new RealSubject();        //代理角色        Subject proxy = new ProxySubject(realSubject);                //真实角色的行为        realSubject.request();        //代理角色代替真实角色进行操作        proxy.request();    }}

 

二、动态代理

前面的例子是静态代理,这里静态指的是在编译器就生成了代理对象。显然ProxySubject是在编译器就生成了。

相反,动态代理指的就是在运行时生成代理对象。那动态代理怎么实现呢?

1.JDK动态代理

其实JDK中已经提供了对动态代理内置的支持,只需要用到3个类:

  • Proxy
  • CLassLoader
  • InvocationHandler

 

 

public class Client {    public static void main(String[] args) {        // 真实角色        Subject realSubject = new RealSubject();        ClassLoader loader = RealSubject.class.getClassLoader();// 与真实角色具有相同的classloader        Class<?>[] interfaces = { Subject.class };// 共同的接口        InvocationHandler h = new MyInvocationHandler(realSubject);// 实现增强操作        // 代理角色(动态创建)        Subject proxy = (Subject) Proxy.newProxyInstance(loader, interfaces, h);        // 真实角色的操作        realSubject.request();        // 代理角色代替真实角色进行操作        proxy.request();    }}class MyInvocationHandler implements InvocationHandler {    private Subject realSubject;    public MyInvocationHandler(Subject realSubject) {        this.realSubject = realSubject;    }    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        // 前置增强        preRequest();        Object rs = method.invoke(realSubject, args);        // 后置增强        postRequest();        return rs;    }    private void preRequest() {        System.out.println("增强操作:before操作");    }    private void postRequest() {        System.out.println("增强操作:after操作");    }}

 

设计模式-代理模式(Proxy)