设计模式之代理模式

代理模式

静态代理

public interface Subject{
    void doSomething();
}
public class RealSubject implements Subject{
    @Override
    public void doSomething() {
        System.out.println( "call doSomething()" );
    }
}
public class AnotherRealSubject implements Subject{
    @Override
    public void doSomething() {
        System.out.println("call another doSomething().");
    }
}
public class TestProxy {
    public static void main(String[] args) {
        // static proxy
        new SubjectProxy().doSomething();
    }
}
// output:
// call doSomething()

动态代理

// 动态代理的核心,将代理类抽象出来,作为独立逻辑
public class ProxyHandler implements InvocationHandler{

    private Object target;

    /**
     *  绑定委托对象,并返回代理类
     */
    public Object bind(Object target){
        this.target = target;
        //绑定该类实现的所有接口,取得代理类
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = null;
        //这里就可以进行所谓的AOP编程了
        //在调用具体函数方法前,执行功能处理
        result= method.invoke(target, args);
        //在调用具体函数方法后,执行功能处理

        return result;
    }
}
public class TestProxy {
    public static void main(String[] args) {
        // dynamical proxy
        ProxyHandler proxyHandler = new ProxyHandler();
        // Object 1
        Subject subject = (Subject) proxyHandler.bind(new RealSubject());
        subject.doSomething();
        // Object 2
        Subject mocked = (Subject) proxyHandler.bind(new AnotherRealSubject());
        mocked.doSomething();
    }
}

// output:
// call doSomething()
// call doSomething()
// call another doSomething().

由上图代码可看到,proxy逻辑被抽象到ProxyHandler中,与业务完全解耦,业务中只需要动态绑定委托对象,即可对委托对象的中的方法增强处理。

你可能感兴趣的:(设计模式之代理模式)