靜態代理與動態代理的實現

原文:proxy.md
源碼:proxy

靜態代理類圖

靜態代理

動態代理類圖:

動態代理

代碼實現:

/**
 * 委託類的上層接口
 * 在靜態代理中是委託類和代理類的上層接口
 *
 */
public interface Sell {
    void sell();
}
/**
 * 委託類,被代理類
 *
 */
public class Principal implements Sell {
    @Override
    public void sell() {
        System.out.println("Principal sales");
    }
}
/**
 * 代理類,靜態代理
 * 
 */
public class StaticAgent implements Sell {
    private Principal principal = new Principal();

    @Override
    public void sell() {
        System.out.println("static");
        principal.sell();
    }
}
/**
 * 動態代理的代理類,不再與委託類實現同一個接口
 *
 */
public class DynamicAgent implements InvocationHandler {
    private Sell principal = new Principal();

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("dynamic");
        return method.invoke(principal, args);
    }
}
import java.lang.reflect.Proxy;
/**
 * 測試類
 */
public class ProxyTest {
    public static void main(String[] args) throws Exception{

        // 靜態代理
        Sell sell1 = new StaticAgent();
        sell1.sell();

        // 動態代理
        DynamicAgent dynamicAgent = new DynamicAgent();
        Sell sell2 = (Sell) Proxy.newProxyInstance(Sell.class.getClassLoader(), new Class[]{Sell.class}, dynamicAgent);
        sell2.sell();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章