什么是靜態(tài)代理設(shè)計(jì)模式

本篇內(nèi)容主要講解“什么是靜態(tài)代理設(shè)計(jì)模式”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“什么是靜態(tài)代理設(shè)計(jì)模式”吧!

站在用戶的角度思考問題,與客戶深入溝通,找到蒙城網(wǎng)站設(shè)計(jì)與蒙城網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋蒙城地區(qū)。

靜態(tài)代理設(shè)計(jì)模式

代理設(shè)計(jì)模式是在程序開發(fā)中使用最多的設(shè)計(jì)模式,代理設(shè)計(jì)模式的核心是有真實(shí)業(yè)務(wù)實(shí)現(xiàn)類和代理業(yè)務(wù)實(shí)現(xiàn)類,并且代理類要完成比真實(shí)業(yè)務(wù)更多的處理操作。

傳統(tǒng)代理設(shè)計(jì)模式的弊端

所有的代理設(shè)計(jì)模式如果按照設(shè)計(jì)要求來說,必須是基于接口的設(shè)計(jì),也就是說需要首先定義出核心接口的組成。
范例:模擬一個(gè)消息發(fā)送的代理操作結(jié)構(gòu)(傳統(tǒng)代理設(shè)計(jì))

public class JavaAPIDemo {public static void main(String[] args)throws Exception{
        IMessage message=new MessageProxy(new MessageReal());
        message.send();
    }
}interface IMessage{   //傳統(tǒng)代理設(shè)計(jì)必須有接口public void send();   //業(yè)務(wù)方法}class MessageReal implements IMessage {@Overridepublic void send() {
        System.out.println("【發(fā)送消息】www.mldn.cn");
    }
}class MessageProxy implements IMessage {   //代理類private IMessage message;  //代理對(duì)象,一定是業(yè)務(wù)接口實(shí)例public MessageProxy(IMessage message){this.message=message;
    }@Overridepublic void send() {if(this.connect()){this.message.send();  //消息的發(fā)送處理this.close();
        }
    }public boolean connect(){
        System.out.println("【消息代理】進(jìn)行消息發(fā)送通道的連接。");return true;
    }public void close(){
        System.out.println("【消息代理】關(guān)閉消息通道。");
    }
}

執(zhí)行結(jié)果:
什么是靜態(tài)代理設(shè)計(jì)模式

以上的操作代碼是一個(gè)最為標(biāo)準(zhǔn)的代理設(shè)計(jì),但是如果要進(jìn)一步的去思考會(huì)發(fā)現(xiàn)客戶端的接口與具體的子類產(chǎn)生了耦合問題,所以這樣的操作如果從實(shí)際的開發(fā)來講,最好再引入工廠設(shè)計(jì)模式進(jìn)行代理對(duì)象的獲取。

以上的代理設(shè)計(jì)模式為靜態(tài)代理設(shè)計(jì),這種靜態(tài)代理涉及的特點(diǎn)在于:一個(gè)代理類只為一個(gè)接口服務(wù),如果現(xiàn)在準(zhǔn)備有3000個(gè)業(yè)務(wù)接口,則按照此種做法就意味著需要編寫3000個(gè)代理類,并且這些代理類操作形式類似。

所以現(xiàn)在需要解決的問題在于:如何可以讓一個(gè)代理類滿足于所有的業(yè)務(wù)接口操作要求。

動(dòng)態(tài)代理設(shè)計(jì)模式

通過靜態(tài)代理設(shè)計(jì)模式的缺陷可以發(fā)現(xiàn),最好的做法是為所有功能一致的業(yè)務(wù)操作接口提供有統(tǒng)一的代理處理操作,而這就可以通過動(dòng)態(tài)代理機(jī)制來實(shí)現(xiàn),但是在動(dòng)態(tài)代理機(jī)制中需要考慮到如下幾點(diǎn)問題:

  • 不管是動(dòng)態(tài)代理類還是靜態(tài)代理類都一定要接收真實(shí)業(yè)務(wù)實(shí)現(xiàn)子類對(duì)象;

  • 由于動(dòng)態(tài)代理類不再與某一個(gè)具體的接口進(jìn)行捆綁,所以應(yīng)該可以動(dòng)態(tài)獲取類的接口信息。

什么是靜態(tài)代理設(shè)計(jì)模式
動(dòng)態(tài)代理設(shè)計(jì)模式

在進(jìn)行動(dòng)態(tài)代理實(shí)現(xiàn)的操作中,首先需要關(guān)注的就是一個(gè)InvocationHandler接口,這個(gè)接口規(guī)定了代理方法的執(zhí)行。

public interface InvocationHandler{/**     * 代理方法調(diào)用,代理主體類中執(zhí)行的方法最終都是此方法     * @param proxy 要代理的對(duì)象     * @param method 要執(zhí)行的接口方法名稱     * @param args 傳遞的參數(shù)     * @return 某一個(gè)方法的返回值     * @throws Throwable 方法調(diào)用時(shí)出現(xiàn)的錯(cuò)誤繼續(xù)向上拋出     */public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
}

在進(jìn)行動(dòng)態(tài)代理設(shè)計(jì)時(shí),對(duì)于動(dòng)態(tài)對(duì)象的創(chuàng)建是由JVM底層完成的,此時(shí)主要依靠的是java.lang.reflect.Proxy程序類,而這個(gè)類中只提供了一個(gè)核心方法:
代理對(duì)象:public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)

  • ClassLoader loader:獲取當(dāng)前真實(shí)主體類的ClassLoader;

  • Class<?>[] interfaces:代理是圍繞接口進(jìn)行的,所以一定要獲取真實(shí)主體類的接口信息;

  • InvocationHandler h:代理處理的方法;

范例:實(shí)現(xiàn)動(dòng)態(tài)代理機(jī)制

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;  //保存真實(shí)業(yè)務(wù)對(duì)象/**
     * 進(jìn)行真實(shí)業(yè)務(wù)對(duì)象與代理業(yè)務(wù)對(duì)象之間的綁定處理
     * @param target 真實(shí)業(yè)務(wù)對(duì)象
     * @return Proxy生成的代理業(yè)務(wù)對(duì)象
     */public Object bind(Object target){this.target = target;return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),this);
    }public boolean connect(){
        System.out.println("【消息代理】進(jìn)行消息發(fā)送通道的連接。");return true;
    }public void close(){
        System.out.println("【消息代理】關(guān)閉消息通道。");
    }@Overridepublic Object invoke(Object pro, Method method, Object[] args) throws Throwable {
        System.out.println("*****【執(zhí)行方法: 】"+method);
        Object returnData = null;if(this.connect()){
            returnData = method.invoke(this.target, args);this.close();
        }return returnData;
    }
}interface IMessage{  //傳統(tǒng)代理設(shè)計(jì)必須有接口void send();  //業(yè)務(wù)方法}class MessageReal implements IMessage {@Overridepublic void send() {
        System.out.println("【發(fā)送消息】www.mldn.cn");
    }
}

執(zhí)行結(jié)果:
什么是靜態(tài)代理設(shè)計(jì)模式

如果認(rèn)真觀察系統(tǒng)中提供的Proxy.newProxyInstance()方法,會(huì)發(fā)現(xiàn)該方法會(huì)使用大量的底層機(jī)制來進(jìn)行代理對(duì)象的動(dòng)態(tài)創(chuàng)建,所有的代理類是符合所有相關(guān)功能需求的操作功能類,它不再代表具體的接口,這樣在處理時(shí)就必須依賴于類加載器與接口進(jìn)行代理對(duì)象的偽造。

到此,相信大家對(duì)“什么是靜態(tài)代理設(shè)計(jì)模式”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

新聞標(biāo)題:什么是靜態(tài)代理設(shè)計(jì)模式
本文URL:http://muchs.cn/article10/gdopgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、搜索引擎優(yōu)化域名注冊(cè)、做網(wǎng)站營(yíng)銷型網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司