1. 代理模式
代理模式就是為其他物件提供一個代理來控制對這個物件的存取。其實代理模式是在存取的物件時引入一定程度的間接性,這種間接性可以附加多種用途。
它的特徵是代理類別與委託類有同樣的接口,代理類主要負責為委託類預處理訊息、過濾訊息、把訊息轉發給委託類,以及事後處理訊息等。代理類別與委託類別之間通常會存在關聯關係,一個代理類別的物件與一個委託類別的物件關聯,代理類別的物件本身並不真正實現服務,而是透過呼叫委託類別的物件的相關方法,來提供特定的服務。
2. 分類
代理類別依照建立時期可以分為兩種,靜態代理類別和動態代理類別。
靜態代理程式類別:由程式設計師建立或由特定工具自動產生原始程式碼,再對其編譯。在程式運行前,代理類別的.class檔案就已經存在了。
動態代理程式類別:在程式運作時,運用反射機制動態創建而成。
3. 靜態代理程式和動態代理範例
靜態代理程式:
業務介面類別:
package com.bjpowernode.pattern; public interface UserManager { public void addUser(String userId, String userName); public void delUser(String userId); public void modifyUser(String userId, String userName); public String findUser(String userId); }
業務介面實作類:
package com.bjpowernode.pattern; public class UserManagerImpl implements UserManager { public void addUser(String userId, String userName) { //System.out.println("start-->>addUser() userId-->>" + userId); try { System.out.println("UserManagerImpl.addUser() userId-->>" + userId); //System.out.println("success-->>addUser()"); }catch(Exception e) { e.printStackTrace(); //System.out.println("error-->>addUser()"); throw new RuntimeException(); } } public void delUser(String userId) { System.out.println("UserManagerImpl.delUser() userId-->>" + userId); } public String findUser(String userId) { System.out.println("UserManagerImpl.findUser() userId-->>" + userId); return "张三"; } public void modifyUser(String userId, String userName) { System.out.println("UserManagerImpl.modifyUser() userId-->>" + userId); } }
業務代理程式類別:
package com.bjpowernode.pattern; public class UserManagerImplProxy implements UserManager { private UserManager userManager; public UserManagerImplProxy(UserManager userManager) { this.userManager = userManager; } public void addUser(String userId, String userName) { try { System.out.println("start-->>addUser() userId-->>" + userId); userManager.addUser(userId, userName); System.out.println("success-->>addUser()"); }catch(Exception e) { e.printStackTrace(); System.out.println("error-->>addUser()"); } } public void delUser(String userId) { } public String findUser(String userId) { return null; } public void modifyUser(String userId, String userName) { } }
客戶端類別:
package com.bjpowernode.pattern; public class Client { /** * @param args */ public static void main(String[] args) { //UserManager userManager = new UserManagerImpl(); UserManager userManager = new UserManagerImplProxy(new UserManagerImpl()); userManager.addUser("0001", "张三"); } }
運行結果:
start-->>addUser() userId-->>0001 UserManagerImpl.addUser() userId-->>0001 success-->>addUser()
動態代理程式:
#。介面類別:
package com.bjpowernode.pattern; public interface UserManager { public String test(String userId); }
業務介面實作類別:
package com.bjpowernode.pattern; public class UserManagerImpl implements UserManager { public String test(String userId) { System.out.println("UserManagerImpl.findUser() userId-->>" + userId); return "张三"; } }
BusinessHandler類別:
package com.bjpowernode.pattern; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class BusinessHandler implements InvocationHandler { private Object targetObject; public Object newProxyInstance(Object targetObject) { this.targetObject = targetObject; return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("start-->>" + method.getName()); for (int i=0; i<args.length; i++) { System.out.println(args[i]); } Object ret = null; try { //调用目标方法 ret = method.invoke(targetObject, args); System.out.println("success-->>" + method.getName()); }catch(Exception e) { e.printStackTrace(); System.out.println("error-->>" + method.getName()); throw e; } return ret; } }
客戶端類別:
package com.bjpowernode.pattern; import java.lang.reflect.Field; public class Client { /** * @param args */ public static void main(String[] args) { BusinessHandler businessHandler = new BusinessHandler(); UserManager userManager = (UserManager)businessHandler.newProxyInstance(new UserManagerImpl()); //userManager.addUser("0001", "张三"); //userManager.delUser("0001"); // System.out.println(userManager.getClass().getName()); String name = userManager.test("0001"); //String name = ((UserManagerImpl) logHandler.newProxyInstance(new UserManagerImpl())).test("0001"); System.out.println("Client.main() --- " + name); } }
執行結果:
start-->>test 0001 UserManagerImpl.findUser() userId-->>0001 success-->>test Client.main() --- 张三
以上是Java反射機制中動態代理程式的範例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!