Java代理模式-靜態代理和動態代理
阿新 • • 發佈:2021-11-04
靜態代理
以租房為示例,不廢話上程式碼
建立租房介面
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)
-
-
method,
:呼叫的方法 -
args