資源描述:
《java設(shè)計(jì)模式之代理模式》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、代理模式代理模式即ProxyPattern,什么是代理模式呢?即對其他對象提供一種代理以控制對這個(gè)對象的訪問。例如,我們有一個(gè)類不想被其他類直接調(diào)用,我們怎么辦呢?我們只能通過代理的形式,讓其他的類來調(diào)用代理類,代理類必須和目標(biāo)類是用的同一個(gè)方法,且代理類的方法可以在目標(biāo)類的基礎(chǔ)上進(jìn)行功能擴(kuò)展,形式如下:目標(biāo)類:classPerson{voidsay{syso(‘hello’);}}代理類:classPersonProxy{voidsay{starttimePerson.say();endtime}}代
2、理的架構(gòu)圖如下:面向方面編程AOP什么是AOP(Aspectorientedprogram)呢?系統(tǒng)中存在交叉業(yè)務(wù),一個(gè)交叉業(yè)務(wù)就是要切入到系統(tǒng)中的一個(gè)方面。交叉業(yè)務(wù)即安全,事務(wù),日志等功能貫穿到好多個(gè)模塊中。即它的重要原則是,不要把供貨商暴露給你的客戶。AOP的目標(biāo)就是要使交叉業(yè)務(wù)模塊化。AOP即代理類在目標(biāo)類的方法的周圍放上一些安全,事物,日志,我們能實(shí)現(xiàn)和目標(biāo)類一樣的功能。動態(tài)代理技術(shù)什么是動態(tài)代理呢?即JVM可以在運(yùn)行期動態(tài)生成出類的字節(jié)碼,這種動態(tài)生成的類往往被用作代理類,即動態(tài)代理類注意:J
3、VM生成的動態(tài)類必須實(shí)現(xiàn)一個(gè)或多個(gè)接口,所以Jvm生成的動態(tài)類只能用作具有相同接口的目標(biāo)類的代理代理類的各個(gè)方法通常除了要調(diào)用目標(biāo)的相應(yīng)的方法對外返回目標(biāo)的結(jié)果外,還可以在代理方法中的四個(gè)位置加上系統(tǒng)的功能代碼:a)在調(diào)用目標(biāo)方法之前、b)在調(diào)用目標(biāo)方法之后c)在調(diào)用目標(biāo)方法的前后都有d)在處理目標(biāo)方法異常的catch塊中總結(jié):即:當(dāng)我們代理類想去代理一個(gè)目標(biāo)類的時(shí)候,我們通過什么方式來知道目標(biāo)類的方法呢?我們只能讓要被代理的目標(biāo)類繼承一個(gè)或多個(gè)接口,這些接口的方法,目標(biāo)類并繼承了這些方法。代理類也必須
4、繼承目標(biāo)類所繼承的接口,即也必須實(shí)現(xiàn)了接口的的方法,而且我們在實(shí)現(xiàn)接口方法的同時(shí)可以在周圍加上安全,事物,日志等擴(kuò)展功能。當(dāng)我目標(biāo)類沒有繼承接口,我們只能通過CGLIB庫動態(tài)的生成一個(gè)類的子類,一個(gè)類的子類也可以作為一個(gè)代理類。我們通常在寫代理常用的方法.代理類為Proxy。a)staticClass>getProxyClass(ClassLoaderloader,Class>...interfaces):返回代理類的java.lang.Class對象,并向其提供類加載器和接口數(shù)組。b)stat
5、icObjectnewProxyInstance(ClassLoaderloader,Class>[]interfaces,InvocationHandlerh):返回一個(gè)指定接口的代理類實(shí)例,該接口可以將方法調(diào)用指派到指定的調(diào)用處理程序。我們根據(jù)方法,總共有兩種方式:第一種:publicclassProxyTest2{publicstaticvoidmain(String[]args)throwsException{ClassclazzProxy=Proxy.getProxyClass(Colle
6、ction.class.getClassLoader(),Collection.class);Constructorconsclazz=clazzProxy.getConstructor(InvocationHandler.class);classMyInvocationHandlerimplementsInvocationHandler{ArrayListtarget=newArrayList();@OverridepublicObjectinvoke(Objectproxy,Methodmethod
7、,Object[]args)throwsThrowable{ObjectretVal=method.invoke(target,args);returnretVal;}}Collectioncoll=(Collection)consclazz.newInstance(newMyInvocationHandler());coll.add("haha");coll.add("heihei");System.out.println(coll.size());}}第二種:publicclassProxyTest
8、3{publicstaticvoidmain(String[]args){Collectioncoll=(Collection)Proxy.newProxyInstance(Collection.class.getClassLoader(),newClass[]{Collection.class},newInvocationHandler(){ArrayListtarget=newArrayList();publicObjectinvoke