亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        淺析java代理模式

        2014-12-31 00:00:00黃沖

        摘 要:本文基于JAVA語言對靜態(tài)和動態(tài)代理做出了分析,并且進(jìn)行了實(shí)現(xiàn),對以后理解JAVA的JDK和 Cglib包提供的代理服務(wù)打下基礎(chǔ)。

        關(guān)鍵詞:設(shè)計(jì)模式;靜態(tài)代理;動態(tài)代理

        中圖分類號:TP393.02

        代理模式是一個非常重要的設(shè)計(jì)模式,不但我們自己在設(shè)計(jì)程序的時候經(jīng)常用到,很多著名的框架如Spring、Hibernate等都用到了代理模式,因此理解并且學(xué)會靈活使用代理模式就非常必要。

        代理模式的定義:對其他對象提供一種代理以控制對這個對象的訪問。簡單地說,代理類具有和被代理類一樣的方法,調(diào)用者通過調(diào)用代理類的方法間接調(diào)用了被代理類相同名字的方法,對于調(diào)用者來說,它不用察覺自己調(diào)用的是代理類的方法,感覺上仍然在調(diào)用被代理類的方法。對于被代理類來說,代理類可以在調(diào)用其方法前后做其他工作,比如寫日志等。按照代理的創(chuàng)建時期,代理類可以分為兩種:靜態(tài)代理類:在程序運(yùn)行前,由程序員創(chuàng)建再編譯成.class文件;動態(tài)代理類:在程序運(yùn)行時,運(yùn)用反射機(jī)制動態(tài)創(chuàng)建而成。

        1 靜態(tài)代理

        靜態(tài)代理類:由程序員創(chuàng)建或由特定工具自動生成源代碼,再對其編譯。在程序運(yùn)行前,代理類的.class文件就已經(jīng)存在了。靜態(tài)代理原理就是聚合+多態(tài)。

        1.1 靜態(tài)代理

        靜態(tài)代理模式有三個角色:抽象接口、代理類、被代理類。其它類通過訪問代理類來訪問被代理類。

        1.2 靜態(tài)代理的實(shí)現(xiàn)

        (1)建一個抽象接口

        public interface Subject {

        public void print(String words);

        }

        (2)建一個被代理類,需要實(shí)現(xiàn)抽象接口

        public class RealSubject implements Subject{

        public void print(String words) {

        System.out.println(\"被代理人郭襄說:\"+words);

        }

        }

        (3)建一個代理類,需要實(shí)現(xiàn)抽象接口

        public class ProxySubjectimplements Subject{

        private Subject s;

        public ProxySubject(Subject s){

        this.s=s;

        }

        public void print(String words) {

        System.out.println(\"我是代理,我名字叫黃蓉!\");

        s.print(words);

        System.out.println(\"黃蓉代理完畢!\");

        }

        }

        (4)建一個客戶端程序測試,關(guān)鍵代碼如下:

        Subject sub1=new RealSubject();

        Subject sub2=new ProxySubject(sub1);

        sub2.print(\"你好!\");

        運(yùn)行輸出:我是代理,我的名字叫黃蓉!;被代理的人郭襄說:你好??;黃蓉代理完畢。從輸出可以看出,在真實(shí)對象的print方法被調(diào)用前后,代理對象都做了其他操作。對于客戶端來說,它只對接口Subject編程,提高了代碼的可維護(hù)和可升級性。

        2 動態(tài)代理

        動態(tài)代理類:就是其代理類是在程序運(yùn)行時,運(yùn)用反射機(jī)制動態(tài)創(chuàng)建而成,并不需要像靜態(tài)代理那樣子事先要編寫好代理類。如果有多重代理,就要寫多個代理類,還有如果一個類有多個方法都需要代理的話,就更加使得代碼很臃腫,不易維護(hù),這個時候就需要動態(tài)地來生成代理類,這就是動態(tài)代理。

        2.1 動態(tài)代理

        動態(tài)代理模式至少要有6個角色:(1)抽象接口;(2)被代理類;(3)處理器接口;(4)自定義的處理器(實(shí)現(xiàn)處理器接口);(5)生成成代理類的類;(6)代理類(由第5點(diǎn)的類通過反射技術(shù)自動生成)。

        2.2 動態(tài)代理的實(shí)現(xiàn)

        (1)首先建一個抽象接口

        public interface Subject {

        public void print();

        }

        (2)建一個被代理類,需要實(shí)現(xiàn)Subject接口

        public class RealSubject implements Subject{

        publicvoid print() {

        System.out.println(\"被代理人郭襄\");

        }

        }

        (3)建一個處理接口

        public interface InvocationHandler {

        public Object invoke(Object proxy, Method method)throws Exception;

        }

        (4)建一個用戶自定義的處理器,需要實(shí)現(xiàn)處理接口

        在invoke()方法里寫上被代理類的方法調(diào)用前后要進(jìn)行的動作。這個invoke()方法我們不用直接調(diào)用,是讓將來自動生成的代理類去調(diào)用的。invoke()方法關(guān)鍵代碼如下:

        System.out.println(\"我是代理人郭靖,開始代理\");

        method.invoke(delegate);

        System.out.println(\"我是代理人郭靖,代理完畢\");

        (5)建生成代理類的類,主要是運(yùn)用java的反射技術(shù)和jdk的編譯工具生成代理類對象并加載到內(nèi)存里面,代碼比較復(fù)雜,這里不再詳細(xì)描述。

        (6)編寫測試客戶端,關(guān)鍵代碼如下

        Subject sub1=newRealSubject();

        LogHandler hander=newLogHandler();

        Subject sub2=(Subject)hander.bind(sub1);

        sub2.print();

        輸出結(jié)果:我是代理人郭靖;開始代理;被代理的人郭襄;我是代理人郭靖,代理完畢。從結(jié)果可以看出,代理成功,并且自動生成了代理類$Proxy.java文件,并成功實(shí)現(xiàn)了代理的效果。

        2.3 動態(tài)代理的優(yōu)勢

        動態(tài)代理的明顯好處上面就體現(xiàn)出來了:對于同一個對象的所有方法,如果對所有方法都是相同的處理邏輯,只需要寫一次處理邏輯就行;對于同一個抽象接口,不同的對象,如果對所有對象的相同名字的方法具有相同的處理邏輯(同一個對象,不同方法的處理邏輯可以不同),也只需要寫一次處理邏輯就行,只需要寫一次處理器類即可;如果某一天,那個方法的處理邏輯被改變了,只需要改動一次即可,如果是靜態(tài)代理,每個代理類下的相對應(yīng)的方法的處理邏輯都要改動一次,維護(hù)非常困難。

        3 結(jié)束語

        代理模式可以運(yùn)用在如下這些方面:(1)用于在程序調(diào)用前后記錄相關(guān)日志及其他附加操作;(2)用于某些操作前的安全及權(quán)限的驗(yàn)證等保護(hù)操作;(3)用于創(chuàng)建對象,也叫虛代理,對于某些大對象,在真正需要它的時候,運(yùn)用代理模式去創(chuàng)建;(4)使得同一對象被多個客戶同時訪問不產(chǎn)生沖突。

        我們可以靈活使用代理模式,配合其他模式的使用,如工廠模式,使我們的程序更加高內(nèi)聚、低耦合,而且非常優(yōu)雅。

        參考文獻(xiàn):

        [1]陳丁山.設(shè)計(jì)模式的研究與應(yīng)用[J].電腦知識與技術(shù)(學(xué)術(shù)交流),2007(23).

        [2]周鳳麗,邵平凡,萬程鵬.設(shè)計(jì)模式在B/S開發(fā)中的應(yīng)用[J].科技創(chuàng)業(yè)月刊,2005(12).

        作者簡介:黃沖(1986.07-),男,廣東湛江人,本科,助理工程師,研究方向:計(jì)算機(jī)。

        工作單位:廣東金融學(xué)院,廣州 510521

        国产亚洲av片在线观看18女人| 亚洲精品有码日本久久久| 亚洲综合色无码| 野花在线无码视频在线播放 | 在线视频观看免费视频18| 日产国产精品亚洲系列| 亚洲VA中文字幕无码毛片春药| 亚洲精品熟女乱色一区| 国产麻豆精品传媒av在线| 中文 在线 日韩 亚洲 欧美| 色婷婷七月| 国产亚洲欧美日韩国产片| 一区二区亚洲 av免费| 日本女同视频一区二区三区| 亚洲国产精品综合久久网络 | 三年中文在线观看免费大全| 色吧综合网| 亚洲黄色官网在线观看| 男女男精品视频网站免费看| 米奇777四色精品人人爽| 成年女人A级毛片免| 国产黄色三级三级三级看三级| 99re66在线观看精品免费| 欧洲极品少妇| 亚洲欧美国产精品久久久| 亚洲女av中文字幕一区二区| 欧美人伦禁忌dvd放荡欲情| 福利一区视频| 国产一区二区免费在线观看视频| 日本妇人成熟免费2020| 风间由美性色一区二区三区| 亚洲综合伦理| 亚洲不卡av一区二区三区四区 | 又大又粗又爽18禁免费看 | 亚洲精品6久久久久中文字幕| 国产伦精品一区二区三区| 精品露脸国产偷人在视频| 天天色影网| 国产在线一区二区三区av| 蜜桃久久综合一区二区| 亚洲精品久久区二区三区蜜桃臀|