设计模式之代理模式

来源:互联网 发布:杜兰 金融 知乎 编辑:程序博客网 时间:2024/06/16 14:04
  1. 什么是代理模式(Proxy)

    • 为其他对象提供一种代理以控制对这个对象的访问
  2. 代理模式的几个角色

    • Subject抽象主题角色,可以是一个抽象类或者接口,定义通用的业务
    • RealSubject具体主题角色,被代理角色,是业务具体的执行者
    • Proxy代理主题角色,也是委托类、代理类,负责对真实对象的应用,可以做预处理或者善后处理
  3. 示例代码(示例中包括基本的代理模式、强制代理、动态代理)
    • 基本的代理模式
package com.pattern.proxy.base;/** * 接口类,所有的具体Subject都要实现这个接口 * @author yjzhou */public interface Subject {    public void request();}
package com.pattern.proxy.base;/** * 具体的subject类,实现完成Subject接口中的方法 * @author yjzhou */public class RealSubject implements Subject{    @Override    public void request() {        System.out.println("具体主题类执行request----");    }}
package com.pattern.proxy.base;/** * 代理类,代理处理Subject类的request的方法 * @author yjzhou */public class ProxySubject implements Subject{    private Subject subject;    /**     * 通过构造函数传递被代理者     * @param subject     */    public ProxySubject(Subject subject) {        this.subject = subject;    }    @Override    public void request() {        before();        subject.request();        after();    }    /**     * 预处理     */    private void before(){        System.out.println("代理执行前的预处理-----");    }    /**     * 后处理     */    private void after(){        System.out.println("代理执行完成后的处理-----");    }}
package com.pattern.proxy.base;/** * 基本的代理模式测试类 * @author yjzhou */public class TestProxy {    public static void main(String[] args) {        ProxySubject proxy = new ProxySubject(new RealSubject());        proxy.request();        RealSubject realSubject = new RealSubject();        realSubject.request();    }}
  • 强制代理
package com.pattern.proxy.force;public interface Subject {    public void request();    public Subject getProxy();}
package com.pattern.proxy.force;public class RealSubject implements Subject {    private ProxyForce proxy = null;    public RealSubject() {        // TODO Auto-generated constructor stub    }    @Override    public void request() {        if (isProxy()) {            System.out.println("具体主题执行reques------");        } else {            System.out.println("请使用指定代理访问----");        }    }    @Override    public Subject getProxy() {        this.proxy = new ProxyForce(this);        return this.proxy;    }    private boolean isProxy() {        if (null == this.proxy) {            return false;        } else {            return true;        }    }}
package com.pattern.proxy.force;public class ProxyForce implements Subject{    private Subject subject;    public ProxyForce(Subject subject) {        this.subject = subject;    }    @Override    public void request() {        before();        subject.request();        after();    }    @Override    public Subject getProxy() {        return this;    }    /**     * 预处理     */    private void before(){        System.out.println("代理执行前的预处理-----");    }    /**     * 后处理     */    private void after(){        System.out.println("代理执行完成后的处理-----");    }}
package com.pattern.proxy.force;public class TestProxyForce {    public static void main(String[] args) {        //需要代理才能操作        RealSubject realSubject = new RealSubject();        realSubject.request();        System.out.println("---------------------------------------");        //不是指定的代理,同样无法操作        ProxyForce proxyForce = new ProxyForce(realSubject);        proxyForce.request();        System.out.println("---------------------------------------");        //获得代理正确操作        Subject proxy = realSubject.getProxy();        proxy.request();        System.out.println("---------------------------------------");    }}
  • 动态代理
package com.pattern.proxy.dynamic;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class DyProxyHandler implements InvocationHandler{    private Object obj = null;    public DyProxyHandler(Object obj) {        this.obj = obj;    }    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        Object result = method.invoke(obj, args);        return result;    }}
package com.pattern.proxy.dynamic;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Proxy;import com.pattern.proxy.base.RealSubject;import com.pattern.proxy.base.Subject;public class TestDyProxy {    public static void main(String[] args) {        Subject subject = new RealSubject();        InvocationHandler handler = new DyProxyHandler(subject);        Class<?> cls = subject.getClass();        Subject proxySubject = (Subject) Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces() , handler);        proxySubject.request();    }}
0 0