1. 程式人生 > 其它 >Java代理模式-靜態代理和動態代理

Java代理模式-靜態代理和動態代理

靜態代理

以租房為示例,不廢話上程式碼

建立租房介面

public interface Rent {
    public void rent();
}

 

建立房東類

//房東
public class Host implements Rent{

    public void rent() {
        System.out.println("房東要出租房子");
    }
}

  

建立代理物件

public class Proxy implements Rent{
    private Host host;

    public Proxy() {
    }

    
public Proxy(Host host) { this.host = host; } public void rent() { seeHouse(); host.rent(); hetong(); fare(); } // 看房 public void seeHouse(){ System.out.println("中介帶你看房"); } // 收中介費 public void fare(){ System.out.println(
"收中介費"); } // 籤租賃合同 public void hetong(){ System.out.println("籤租賃合同"); } }

  

程式碼測試

public class Client {
    public static void main(String[] args) {
//        房東要租房子
        Host host=new Host();
//        代理,中介幫房東租房子,但是呢?代理角色一般會有一些附屬操作!
        Proxy proxy = new Proxy(host);
// 你不用面對房東,直接找中介租房即可! proxy.rent(); } }

執行結果

中介帶你看房
房東要出租房子
籤租賃合同
收中介費

 

動態代理

動態代理分為兩大類:基於介面的動態代理,基於類的動態代理

需要了解兩個類:proxy代理、InvocationHandler呼叫處理程式

基於介面---JDK原生動態代理

建立租房介面

public interface Rent {
    public void rent();
}

  

建立房東類

public class Host implements Rent {
    public void rent() {
        System.out.println("房東要出租房子");
    }
}

  

建立測試類

public class Client {
    public static void main(String[] args) {
        final Rent host = new Host();
        Rent proxy =(Rent) Proxy.newProxyInstance(host.getClass().getClassLoader(), host.getClass().getInterfaces(), new InvocationHandler() {
            public Object invoke(Object proxy, Method method, Object[] args) throws InvocationTargetException, IllegalAccessException {
                System.out.println("中介帶你看房");
                Object invoke = method.invoke(host, args);
                System.out.println("籤租賃合同");
                return invoke;
            }
        });
        proxy.rent();
    }
}

執行結果

中介帶你看房
房東要出租房子
籤租賃合同

說明一下Proxy物件的newProxyInstance方法

public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
  • ClassLoader loader,:指定當前目標物件使用類載入器,獲取載入器的方法是固定的
  • Class<?>[] interfaces,:目標物件實現的介面的型別,使用泛型方式確認型別
  • InvocationHandler h:事件處理,執行目標物件的方法時,會觸發事件處理器的方法,會把當前執行目標物件的方法作為引數傳入

還有其中InvocationHandler 介面的 invok 方法

public Object invoke(Object proxy, Method method, Object[] args)
  • Cproxy,:就是代理物件,newProxyInstance方法的返回物件

  • method,:呼叫的方法

  • args:方法中的引數