您好,登錄后才能下訂單哦!
本篇內容主要講解“什么是靜態代理設計模式”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“什么是靜態代理設計模式”吧!
代理設計模式是在程序開發中使用最多的設計模式,代理設計模式的核心是有真實業務實現類和代理業務實現類,并且代理類要完成比真實業務更多的處理操作。
所有的代理設計模式如果按照設計要求來說,必須是基于接口的設計,也就是說需要首先定義出核心接口的組成。
范例:模擬一個消息發送的代理操作結構(傳統代理設計)
public class JavaAPIDemo {public static void main(String[] args)throws Exception{ IMessage message=new MessageProxy(new MessageReal()); message.send(); } }interface IMessage{ //傳統代理設計必須有接口public void send(); //業務方法}class MessageReal implements IMessage {@Overridepublic void send() { System.out.println("【發送消息】www.mldn.cn"); } }class MessageProxy implements IMessage { //代理類private IMessage message; //代理對象,一定是業務接口實例public MessageProxy(IMessage message){this.message=message; }@Overridepublic void send() {if(this.connect()){this.message.send(); //消息的發送處理this.close(); } }public boolean connect(){ System.out.println("【消息代理】進行消息發送通道的連接。");return true; }public void close(){ System.out.println("【消息代理】關閉消息通道。"); } }
執行結果:
以上的操作代碼是一個最為標準的代理設計,但是如果要進一步的去思考會發現客戶端的接口與具體的子類產生了耦合問題,所以這樣的操作如果從實際的開發來講,最好再引入工廠設計模式進行代理對象的獲取。
以上的代理設計模式為靜態代理設計,這種靜態代理涉及的特點在于:一個代理類只為一個接口服務,如果現在準備有3000個業務接口,則按照此種做法就意味著需要編寫3000個代理類,并且這些代理類操作形式類似。
所以現在需要解決的問題在于:如何可以讓一個代理類滿足于所有的業務接口操作要求。
通過靜態代理設計模式的缺陷可以發現,最好的做法是為所有功能一致的業務操作接口提供有統一的代理處理操作,而這就可以通過動態代理機制來實現,但是在動態代理機制中需要考慮到如下幾點問題:
不管是動態代理類還是靜態代理類都一定要接收真實業務實現子類對象;
由于動態代理類不再與某一個具體的接口進行捆綁,所以應該可以動態獲取類的接口信息。
動態代理設計模式
在進行動態代理實現的操作中,首先需要關注的就是一個InvocationHandler接口,這個接口規定了代理方法的執行。
public interface InvocationHandler{/** * 代理方法調用,代理主體類中執行的方法最終都是此方法 * @param proxy 要代理的對象 * @param method 要執行的接口方法名稱 * @param args 傳遞的參數 * @return 某一個方法的返回值 * @throws Throwable 方法調用時出現的錯誤繼續向上拋出 */public Object invoke(Object proxy, Method method, Object[] args) throws Throwable; }
在進行動態代理設計時,對于動態對象的創建是由JVM底層完成的,此時主要依靠的是java.lang.reflect.Proxy程序類,而這個類中只提供了一個核心方法:
代理對象:public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
ClassLoader loader:獲取當前真實主體類的ClassLoader;
Class<?>[] interfaces:代理是圍繞接口進行的,所以一定要獲取真實主體類的接口信息;
InvocationHandler h:代理處理的方法;
范例:實現動態代理機制
import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class JavaAPIDemo {public static void main(String[] args)throws Exception{ IMessage msg=(IMessage)new MLDNProxy().bind(new MessageReal()); msg.send(); } }class MLDNProxy implements InvocationHandler{private Object target; //保存真實業務對象/** * 進行真實業務對象與代理業務對象之間的綁定處理 * @param target 真實業務對象 * @return Proxy生成的代理業務對象 */public Object bind(Object target){this.target = target;return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),this); }public boolean connect(){ System.out.println("【消息代理】進行消息發送通道的連接。");return true; }public void close(){ System.out.println("【消息代理】關閉消息通道。"); }@Overridepublic Object invoke(Object pro, Method method, Object[] args) throws Throwable { System.out.println("*****【執行方法: 】"+method); Object returnData = null;if(this.connect()){ returnData = method.invoke(this.target, args);this.close(); }return returnData; } }interface IMessage{ //傳統代理設計必須有接口void send(); //業務方法}class MessageReal implements IMessage {@Overridepublic void send() { System.out.println("【發送消息】www.mldn.cn"); } }
執行結果:
如果認真觀察系統中提供的Proxy.newProxyInstance()方法,會發現該方法會使用大量的底層機制來進行代理對象的動態創建,所有的代理類是符合所有相關功能需求的操作功能類,它不再代表具體的接口,這樣在處理時就必須依賴于類加載器與接口進行代理對象的偽造。
到此,相信大家對“什么是靜態代理設計模式”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。