代理模式(proxy)

定义:为其他对象提供一种代理以控制对这个对象的访问. 优点:职责清晰,高扩展性,智能化

1. 普通代理

定义:只需要访问代理类,不需要知道真实类的存在,通过代理类的构造方法来完成真实类的创建和绑定.

public interface Subject {
    public void request(); 
}

public class RealSubject implements Subject {

    @Override
    public void request() {
        // 业务处理
    }
}

public class Proxy implements Subject {
    private Subject subject = null;

    public Proxy() {
        this.subject = new Proxy();
    }

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

    public void request() {
        this.before();
        this.subject.request();
        this.after();
    }

    private void after() {
        // 预处理
    }

    private void before() {
        // 善后处理
    }
}

2. 强制代理

定义:从真实类查找到代理类,不允许直接访问真实类,允许使用真实类管理的代理类访问真实类的方法.否则不能访问.

3. 动态代理

定义:在实现阶段不关心代理谁,在运行阶段才指定代理哪个对象. 原理:java.lang.reflect.Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)方法返回指定接口的代理类的实例,这些接口将调用方法调用到指定的调用处理程序。

public interface Subject {
    public void request(); 
}

public class RealSubject implements Subject {

    @Override
    public void request() {
        // 业务处理
    }
}

public class ProxyHandler implements InvocationHandler {
    private Subject subject = null;

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

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 预处理
        Objcet obj = method.invoke(this.subject,args);
        // 善后处理
        return obj;
    }
}

public class Test {
    Subject subject = new RealSubject();
    Subject proxy = (Subject)Proxy.newProxyInstance(subject.getClass().getClassLoader(),             subject..getClass().getInterfaces(), new ProxyHandler(subject));
    proxy.request();
}

results matching ""

    No results matching ""